项目中有 500 多个 ts 文件。每次 webpack
启动 watch
都要 40 多秒。修改代码后编译也要 12-16 秒。实在是太慢了,因此尝试优化一下。html
总构建时间( run build): 45672ms
watch 时,修改代码后构建: 12秒vue
webpack-visualizer
分析 webpack 都打包了什么。webpack-visualizer
可将webpack
打包的文件大小可视化,并展示依赖关系。
webpack-visualizer
使用方法。
分析生成的文件可见。文件总大小 1.42M
中,其中 vue 占用了 500K+
。node
可是 webpack 中已排除 vue ,打包中不该包含 vue 模块。webpack
externals: { 'vue': 'Vue', 'vuex': 'Vuex', 'vue-router': 'VueRouter' }
猜想是 import 时 使用了大写的 import Vue from Vue
应该改成 import Vue from vue
,改成 小写后,果真好了。。。
打包的文件变为 838 kB
,打包时间为 41351ms
关于 externals
的更多信息,能够参照webpack externals详解git
项目中使用的ts-loader
来处理TypeScript
,可是速度比较慢。
能够采用两种方式来优化:awesome-typescript-loader
或 thread-loader\Harrypack
+cache-loader\hard-source-webpack-plugin
+tsloader
。
这两种方式都使用到了多核+ 缓存
来加快构建。
下面分别对比了两种优化方式。github
thread-loader
+ cache-loader
+ ts-loader
总构建时间( run build): 27秒
watch 时,修改代码后构建:8 秒web
这里有个官方的例子
webpack.config.js 中修改 loader 和添加插件。vue-router
{ module: { rules: [ { test: /\.ts$/, exclude: /node_modules|vue\/src/, use: [ { loader: 'cache-loader' }, { loader: 'thread-loader', options: { workers: require('os').cpus().length - 1, }, }, { loader: 'ts-loader', options: { happyPackMode: true, // IMPORTANT! use happyPackMode mode to speed-up compilation and reduce errors reported to webpack appendTsSuffixTo: [/\.vue$/], transpileOnly: true, } } ] }, //... ], }, // ... plugins: [ new ForkTsCheckerWebpackPlugin({ checkSyntacticErrors: true }), ] }
awesome-typescript-loader
总构建时间( run build): 27秒
watch 时,修改代码后构建:6.5 秒vuex
{ module: { rules: [ { test: /\.ts$/, exclude: /node_modules|vue\/src/, loader: 'awesome-typescript-loader', }, //... ], }, // ... plugins: [ ] }
注: 这两种方式都采用独立线程来检查 ts 语法错误。实际编译速度可能更快。好比 awesome-typescript-loader
watch 状态,修改后编译为 2 秒。可是加上语法检查要6秒。其实第二秒时已经编译好了。typescript