Skip to content

Commit 2b55576

Browse files
committed
test: test for modernMode
1 parent 0a2ea1f commit 2b55576

File tree

3 files changed

+86
-5
lines changed

3 files changed

+86
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
jest.setTimeout(50000)
2+
3+
const fs = require('fs-extra')
4+
const path = require('path')
5+
const portfinder = require('portfinder')
6+
const { createServer } = require('http-server')
7+
const { defaultPreset } = require('@vue/cli/lib/options')
8+
const create = require('@vue/cli-test-utils/createTestProject')
9+
const launchPuppeteer = require('@vue/cli-test-utils/launchPuppeteer')
10+
11+
let server, browser
12+
test('modern mode', async () => {
13+
const project = await create('modern-mode', defaultPreset)
14+
15+
await project.write('vue.config.js', `
16+
module.exports = {
17+
modernMode: true
18+
}
19+
`)
20+
21+
const { stdout } = await project.run('vue-cli-service build')
22+
expect(stdout).toMatch('Build complete.')
23+
24+
// assert correct bundle files
25+
const files = await fs.readdir(path.join(project.dir, 'dist/js'))
26+
expect(files.some(f => /^app\.\w{8}\.js$/.test(f))).toBe(true)
27+
expect(files.some(f => /^app-legacy\.\w{8}\.js$/.test(f))).toBe(true)
28+
expect(files.some(f => /^chunk-vendors\.\w{8}\.js$/.test(f))).toBe(true)
29+
expect(files.some(f => /^chunk-vendors-legacy\.\w{8}\.js$/.test(f))).toBe(true)
30+
31+
// assert correct asset links
32+
const index = await project.read('dist/index.html')
33+
34+
// should use <script type="module"> for modern bundle
35+
expect(index).toMatch(/<script type=module src=\/js\/chunk-vendors\.\w{8}\.js>/)
36+
expect(index).toMatch(/<script type=module src=\/js\/app\.\w{8}\.js>/)
37+
38+
// should use <link rel="modulepreload"> for modern bundle
39+
expect(index).toMatch(/<link [^>]*js\/chunk-vendors\.\w{8}\.js rel=modulepreload>/)
40+
expect(index).toMatch(/<link [^>]*js\/app\.\w{8}\.js rel=modulepreload>/)
41+
42+
// should use <script nomodule> for legacy bundle
43+
expect(index).toMatch(/<script src=\/js\/chunk-vendors-legacy\.\w{8}\.js nomodule>/)
44+
expect(index).toMatch(/<script src=\/js\/app-legacy\.\w{8}\.js nomodule>/)
45+
46+
// should inject Safari 10 nomodule fix
47+
const { safariFix } = require('../lib/webpack/ModernModePlugin')
48+
expect(index).toMatch(`<script>${safariFix}</script>`)
49+
50+
// start server and ensure the page loads properly
51+
const port = await portfinder.getPortPromise()
52+
server = createServer({ root: path.join(project.dir, 'dist') })
53+
54+
await new Promise((resolve, reject) => {
55+
server.listen(port, err => {
56+
if (err) return reject(err)
57+
resolve()
58+
})
59+
})
60+
61+
const url = `http://localhost:${port}/`
62+
const launched = await launchPuppeteer(url)
63+
browser = launched.browser
64+
const page = launched.page
65+
66+
const getH1Text = async () => page.evaluate(() => {
67+
return document.querySelector('h1').textContent
68+
})
69+
70+
expect(await getH1Text()).toMatch('Welcome to Your Vue.js App')
71+
})
72+
73+
afterAll(async () => {
74+
if (browser) {
75+
await browser.close()
76+
}
77+
if (server) {
78+
server.close()
79+
}
80+
})

packages/@vue/cli-service/__tests__/multiPage.spec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ jest.setTimeout(50000)
22

33
const path = require('path')
44
const portfinder = require('portfinder')
5-
const { defaultPreset } = require('@vue/cli/lib/options')
65
const { createServer } = require('http-server')
6+
const { defaultPreset } = require('@vue/cli/lib/options')
77
const create = require('@vue/cli-test-utils/createTestProject')
88
const serve = require('@vue/cli-test-utils/serveWithPuppeteer')
99
const launchPuppeteer = require('@vue/cli-test-utils/launchPuppeteer')
@@ -65,7 +65,7 @@ test('serve w/ multi page', async () => {
6565
)
6666
})
6767

68-
let server, browser, page
68+
let server, browser
6969
test('build w/ multi page', async () => {
7070
const project = await create('e2e-multi-page-build', defaultPreset)
7171

@@ -149,7 +149,7 @@ test('build w/ multi page', async () => {
149149
const url = `http://localhost:${port}/`
150150
const launched = await launchPuppeteer(url)
151151
browser = launched.browser
152-
page = launched.page
152+
const page = launched.page
153153

154154
const getH1Text = async () => page.evaluate(() => {
155155
return document.querySelector('h1').textContent

packages/@vue/cli-service/lib/webpack/ModernModePlugin.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const fs = require('fs-extra')
22
const path = require('path')
33

44
// https://gist.github.com/samthor/64b114e4a4f539915a95b91ffd340acc
5-
const Safari10NoModuleFix = `!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();`
5+
const safariFix = `!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();`
66

77
class ModernModePlugin {
88
constructor (targetDir, isModern) {
@@ -44,7 +44,7 @@ class ModernModePlugin {
4444
data.body.push({
4545
tagName: 'script',
4646
closeTag: true,
47-
innerHTML: Safari10NoModuleFix
47+
innerHTML: safariFix
4848
})
4949

5050
// inject links for legacy assets as <script nomodule>
@@ -69,4 +69,5 @@ class ModernModePlugin {
6969
}
7070
}
7171

72+
ModernModePlugin.safariFix = safariFix
7273
module.exports = ModernModePlugin

0 commit comments

Comments
 (0)