Skip to content

Commit 8600585

Browse files
authored
feat: detect and compile Vue 3 projects (#5570)
1 parent cc38420 commit 8600585

File tree

4 files changed

+313
-37
lines changed

4 files changed

+313
-37
lines changed

packages/@vue/cli-plugin-typescript/package.json

+6
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,14 @@
3636
},
3737
"peerDependencies": {
3838
"@vue/cli-service": "^3.0.0 || ^4.0.0-0",
39+
"@vue/compiler-sfc": "^3.0.0-beta.14",
3940
"typescript": ">=2"
4041
},
42+
"peerDependenciesMeta": {
43+
"@vue/compiler-sfc": {
44+
"optional": true
45+
}
46+
},
4147
"devDependencies": {
4248
"@types/chai": "^4.2.11",
4349
"@types/jest": "^24.0.19",

packages/@vue/cli-service/lib/config/base.js

+68-36
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const { semver, loadModule } = require('@vue/cli-shared-utils')
2+
13
module.exports = (api, options) => {
24
api.chainWebpack(webpackConfig => {
35
const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD
@@ -51,12 +53,6 @@ module.exports = (api, options) => {
5153
.end()
5254
.alias
5355
.set('@', api.resolve('src'))
54-
.set(
55-
'vue$',
56-
options.runtimeCompiler
57-
? 'vue/dist/vue.esm.js'
58-
: 'vue/dist/vue.runtime.esm.js'
59-
)
6056

6157
webpackConfig.resolveLoader
6258
.plugin('pnp-loaders')
@@ -73,40 +69,76 @@ module.exports = (api, options) => {
7369
// js is handled by cli-plugin-babel ---------------------------------------
7470

7571
// vue-loader --------------------------------------------------------------
76-
const vueLoaderCacheIdentifier = {
77-
'vue-loader': require('vue-loader/package.json').version
78-
}
72+
const vue = loadModule('vue', api.service.context)
73+
74+
if (semver.major(vue.version) === 2) {
75+
// for Vue 2 projects
76+
const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', {
77+
'vue-loader': require('vue-loader/package.json').version,
78+
'@vue/component-compiler-utils': require('@vue/component-compiler-utils/package.json').version,
79+
'vue-template-compiler': require('vue-template-compiler/package.json').version
80+
})
7981

80-
// The following 2 deps are sure to exist in Vue 2 projects.
81-
// But once we switch to Vue 3, they're no longer mandatory.
82-
// (In Vue 3 they are replaced by @vue/compiler-sfc)
83-
// So wrap them in a try catch block.
84-
try {
85-
vueLoaderCacheIdentifier['@vue/component-compiler-utils'] =
86-
require('@vue/component-compiler-utils/package.json').version
87-
vueLoaderCacheIdentifier['vue-template-compiler'] =
88-
require('vue-template-compiler/package.json').version
89-
} catch (e) {}
90-
const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', vueLoaderCacheIdentifier)
82+
webpackConfig.resolve
83+
.alias
84+
.set(
85+
'vue$',
86+
options.runtimeCompiler
87+
? 'vue/dist/vue.esm.js'
88+
: 'vue/dist/vue.runtime.esm.js'
89+
)
90+
91+
webpackConfig.module
92+
.rule('vue')
93+
.test(/\.vue$/)
94+
.use('cache-loader')
95+
.loader(require.resolve('cache-loader'))
96+
.options(vueLoaderCacheConfig)
97+
.end()
98+
.use('vue-loader')
99+
.loader(require.resolve('vue-loader'))
100+
.options(Object.assign({
101+
compilerOptions: {
102+
whitespace: 'condense'
103+
}
104+
}, vueLoaderCacheConfig))
105+
106+
webpackConfig
107+
.plugin('vue-loader')
108+
.use(require('vue-loader').VueLoaderPlugin)
109+
} else if (semver.major(vue.version) === 3) {
110+
// for Vue 3 projects
111+
const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', {
112+
'vue-loader': require('vue-loader-v16/package.json').version,
113+
'@vue/compiler-sfc': require('@vue/compiler-sfc/package.json').version
114+
})
91115

92-
webpackConfig.module
93-
.rule('vue')
94-
.test(/\.vue$/)
95-
.use('cache-loader')
96-
.loader(require.resolve('cache-loader'))
97-
.options(vueLoaderCacheConfig)
116+
webpackConfig.resolve
117+
.alias
118+
.set(
119+
'vue$',
120+
options.runtimeCompiler
121+
? 'vue/dist/vue.esm-bundler.js'
122+
: '@vue/runtime-dom'
123+
)
124+
125+
webpackConfig.module
126+
.rule('vue')
127+
.test(/\.vue$/)
128+
.use('cache-loader')
129+
.loader(require.resolve('cache-loader'))
130+
.options(vueLoaderCacheConfig)
131+
.end()
132+
.use('vue-loader')
133+
.loader(require.resolve('vue-loader'))
134+
.options(vueLoaderCacheConfig)
135+
.end()
98136
.end()
99-
.use('vue-loader')
100-
.loader(require.resolve('vue-loader'))
101-
.options(Object.assign({
102-
compilerOptions: {
103-
whitespace: 'condense'
104-
}
105-
}, vueLoaderCacheConfig))
106137

107-
webpackConfig
108-
.plugin('vue-loader')
109-
.use(require('vue-loader/lib/plugin'))
138+
webpackConfig
139+
.plugin('vue-loader')
140+
.use(require('vue-loader-v16').VueLoaderPlugin)
141+
}
110142

111143
// static assets -----------------------------------------------------------
112144

packages/@vue/cli-service/package.json

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"thread-loader": "^2.1.3",
7070
"url-loader": "^2.2.0",
7171
"vue-loader": "^15.9.2",
72+
"vue-loader-v16": "npm:vue-loader@^16.0.0-beta.3",
7273
"vue-style-loader": "^4.1.2",
7374
"webpack": "^4.0.0",
7475
"webpack-bundle-analyzer": "^3.8.0",
@@ -77,9 +78,13 @@
7778
"webpack-merge": "^4.2.2"
7879
},
7980
"peerDependencies": {
81+
"@vue/compiler-sfc": "^3.0.0-beta.14",
8082
"vue-template-compiler": "^2.0.0"
8183
},
8284
"peerDependenciesMeta": {
85+
"@vue/compiler-sfc": {
86+
"optional": true
87+
},
8388
"less-loader": {
8489
"optional": true
8590
},
@@ -100,6 +105,7 @@
100105
}
101106
},
102107
"devDependencies": {
108+
"@vue/compiler-sfc": "^3.0.0-beta.14",
103109
"fibers": ">= 3.1.1 <5.0.0",
104110
"sass": "^1.26.5",
105111
"sass-loader": "^8.0.2",

0 commit comments

Comments
 (0)