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 : [ / \. v u e $ / ]
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 : [ / \. v u e $ / ] ,
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
0 commit comments