Skip to content

Commit b8f2487

Browse files
committed
feat: parallel mode
1 parent fcfb099 commit b8f2487

File tree

5 files changed

+91
-93
lines changed

5 files changed

+91
-93
lines changed

packages/@vue/cli-plugin-babel/index.js

+21-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
module.exports = api => {
1+
module.exports = (api, options) => {
2+
const useThreads = process.env.NODE_ENV === 'production' && options.parallel
23
const cacheDirectory = api.resolve('node_modules/.cache/cache-loader')
34

45
api.chainWebpack(webpackConfig => {
5-
webpackConfig.module
6+
const jsRule = webpackConfig.module
67
.rule('js')
78
.test(/\.jsx?$/)
89
.include
@@ -13,8 +14,16 @@ module.exports = api => {
1314
.loader('cache-loader')
1415
.options({ cacheDirectory })
1516
.end()
16-
.use('babel-loader')
17-
.loader('babel-loader')
17+
18+
if (useThreads) {
19+
jsRule
20+
.use('thread-loader')
21+
.loader('thread-loader')
22+
}
23+
24+
jsRule
25+
.use('babel-loader')
26+
.loader('babel-loader')
1827

1928
webpackConfig.module
2029
.rule('vue')
@@ -25,11 +34,16 @@ module.exports = api => {
2534
{
2635
loader: 'cache-loader',
2736
options: { cacheDirectory }
28-
},
29-
{
30-
loader: 'babel-loader'
3137
}
3238
]
39+
if (useThreads) {
40+
options.loaders.js.push({
41+
loader: 'thread-loader'
42+
})
43+
}
44+
options.loaders.js.push({
45+
loader: 'babel-loader'
46+
})
3347
return options
3448
})
3549
})

packages/@vue/cli-plugin-typescript/index.js

+50-58
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
module.exports = (api, options) => {
1+
module.exports = (api, {
2+
parallel,
3+
lintOnSave,
4+
experimentalCompileTsWithBabel
5+
}) => {
6+
const useThreads = process.env.NODE_ENV === 'production' && parallel
27
const cacheDirectory = api.resolve('node_modules/.cache/cache-loader')
38

49
api.chainWebpack(config => {
@@ -17,82 +22,69 @@ module.exports = (api, options) => {
1722
.add(api.resolve('src'))
1823
.add(api.resolve('test'))
1924
.end()
20-
.use('cache-loader')
21-
.loader('cache-loader')
22-
.options({ cacheDirectory })
23-
.end()
2425

2526
const vueLoader = config.module
2627
.rule('vue')
2728
.use('vue-loader')
28-
.tap(options => {
29-
options.loaders = options.loaders || {}
30-
options.loaders.ts = [
31-
{
32-
loader: 'cache-loader',
33-
options: { cacheDirectory }
34-
}
35-
]
36-
return options
37-
})
3829

39-
if (!options.experimentalCompileTsWithBabel) {
40-
const tsLoaderOptions = {
41-
transpileOnly: true,
42-
appendTsSuffixTo: [/\.vue$/]
30+
// add a loader to both *.ts & vue<lang="ts">
31+
const addLoader = loader => {
32+
const use = tsRule
33+
.use(loader.loader)
34+
.loader(loader.loader)
35+
if (loader.options) {
36+
use.options(loader.options)
4337
}
38+
vueLoader.tap(options => {
39+
options.loaders = options.loaders || {}
40+
options.loaders.ts = options.loaders.ts || []
41+
options.loaders.ts.push(loader)
42+
return options
43+
})
44+
}
4445

45-
// if has babel plugin, inject babel-loader before ts-loader
46-
if (api.hasPlugin('babel')) {
47-
tsRule
48-
.use('babel-loader')
49-
.loader('babel-loader')
50-
vueLoader
51-
.tap(options => {
52-
options.loaders.ts.push({
53-
loader: 'babel-loader'
54-
})
55-
return options
56-
})
57-
}
46+
addLoader({
47+
loader: 'cache-loader',
48+
options: { cacheDirectory }
49+
})
50+
if (useThreads) {
51+
addLoader({
52+
loader: 'thread-loader'
53+
})
54+
}
5855

59-
// apply ts-loader
60-
tsRule
61-
.use('ts-loader')
62-
.loader('ts-loader')
63-
.options(tsLoaderOptions)
64-
vueLoader
65-
.tap(options => {
66-
options.loaders.ts.push({
67-
loader: 'ts-loader',
68-
options: tsLoaderOptions
69-
})
70-
return options
56+
if (!experimentalCompileTsWithBabel) {
57+
if (api.hasPlugin('babel')) {
58+
addLoader({
59+
loader: 'babel-loader'
7160
})
61+
}
62+
addLoader({
63+
loader: 'ts-loader',
64+
options: {
65+
transpileOnly: true,
66+
appendTsSuffixTo: [/\.vue$/],
67+
// https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
68+
happyPackMode: useThreads
69+
}
70+
})
7271
} else {
7372
// Experimental: compile TS with babel so that it can leverage
7473
// preset-env for auto-detected polyfills based on browserslists config.
7574
// this is pending on the readiness of @babel/preset-typescript.
76-
tsRule
77-
.use('babel-loader')
78-
.loader('babel-loader')
79-
vueLoader
80-
.tap(options => {
81-
options.loaders.ts.push(
82-
{
83-
loader: 'babel-loader'
84-
}
85-
)
86-
return options
87-
})
75+
addLoader({
76+
loader: 'babel-loader'
77+
})
8878
}
8979

9080
config
9181
.plugin('fork-ts-checker')
9282
.use(require('fork-ts-checker-webpack-plugin'), [{
9383
vue: true,
94-
tslint: options.lintOnSave,
95-
formatter: 'codeframe'
84+
tslint: lintOnSave,
85+
formatter: 'codeframe',
86+
// https://github.com/TypeStrong/ts-loader#happypackmode-boolean-defaultfalse
87+
checkSyntacticErrors: useThreads
9688
}])
9789
})
9890

packages/@vue/cli-service/lib/options.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const schema = createSchema(joi => joi.object({
66
compiler: joi.boolean(),
77
productionSourceMap: joi.boolean(),
88
vueLoader: joi.object(),
9+
parallel: joi.boolean(),
910
dll: joi.alternatives().try(
1011
joi.boolean(),
1112
joi.array().items(joi.string())
@@ -22,8 +23,7 @@ const schema = createSchema(joi => joi.object({
2223
}),
2324
devServer: joi.object(),
2425
// known options from offical plugins
25-
lintOnSave: joi.boolean(),
26-
pwa: joi.object()
26+
lintOnSave: joi.boolean()
2727
}))
2828

2929
exports.validate = options => validate(
@@ -49,6 +49,14 @@ exports.defaults = () => ({
4949
// sourceMap for production build?
5050
productionSourceMap: true,
5151

52+
// use thread-loader for babel & TS in production build
53+
// enabled by default if the machine has more than 1 cores
54+
parallel: require('os').cpus().length > 1,
55+
56+
// split vendors using autoDLLPlugin?
57+
// can be an explicit list of dependencies to include in the DLL chunk.
58+
dll: false,
59+
5260
css: {
5361
// boolean | Object, extract css?
5462
extract: true,

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

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"slash": "^1.0.0",
5353
"source-map-url": "^0.4.0",
5454
"string.prototype.padend": "^3.0.0",
55+
"thread-loader": "^1.1.2",
5556
"uglifyjs-webpack-plugin": "^1.1.6",
5657
"url-loader": "^0.6.2",
5758
"vue-loader": "^13.7.0",

yarn.lock

+9-26
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ async@^1.4.0, async@^1.5.0, async@^1.5.2:
10681068
version "1.5.2"
10691069
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
10701070

1071-
async@^2.1.2, async@^2.1.4, async@^2.4.0, async@^2.4.1:
1071+
async@^2.1.2, async@^2.1.4, async@^2.3.0, async@^2.4.0, async@^2.4.1:
10721072
version "2.6.0"
10731073
resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
10741074
dependencies:
@@ -6112,31 +6112,6 @@ levn@^0.3.0, levn@~0.3.0:
61126112
prelude-ls "~1.1.2"
61136113
type-check "~0.3.2"
61146114

6115-
lint-staged@^6.0.0:
6116-
version "6.1.0"
6117-
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.1.0.tgz#28f600c10a6cbd249ceb003118a1552e53544a93"
6118-
dependencies:
6119-
app-root-path "^2.0.0"
6120-
chalk "^2.1.0"
6121-
commander "^2.11.0"
6122-
cosmiconfig "^4.0.0"
6123-
debug "^3.1.0"
6124-
dedent "^0.7.0"
6125-
execa "^0.8.0"
6126-
find-parent-dir "^0.3.0"
6127-
is-glob "^4.0.0"
6128-
jest-validate "^21.1.0"
6129-
listr "^0.13.0"
6130-
lodash "^4.17.4"
6131-
log-symbols "^2.0.0"
6132-
minimatch "^3.0.0"
6133-
npm-which "^3.0.1"
6134-
p-map "^1.1.1"
6135-
path-is-inside "^1.0.2"
6136-
pify "^3.0.0"
6137-
staged-git-files "0.0.4"
6138-
stringify-object "^3.2.0"
6139-
61406115
lint-staged@^6.0.1:
61416116
version "6.0.1"
61426117
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.0.1.tgz#855f2993ab4a265430e2fd9828427e648d65e6b4"
@@ -9467,6 +9442,14 @@ text-table@~0.2.0:
94679442
version "0.2.0"
94689443
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
94699444

9445+
thread-loader@^1.1.2:
9446+
version "1.1.2"
9447+
resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-1.1.2.tgz#45dd1af01d8e421e6002b3c19358650cb9a42518"
9448+
dependencies:
9449+
async "^2.3.0"
9450+
loader-runner "^2.3.0"
9451+
loader-utils "^1.1.0"
9452+
94709453
throat@^4.0.0:
94719454
version "4.1.0"
94729455
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"

0 commit comments

Comments
 (0)