公司前端项目因为一些缘由,不少业务都是放在同一仓库内(例如业务a、b、c,对应目录app/a app/b app/c),而且是用同一套webpack的配置进行打包,每次构建的时候经过传入特定的参数打包指定的业务前端
本文github地址node
@babel/preset-typescript
替代ts-loader
使用babel7
而且使用@babel/preset-typescript
代替ts-loader。一方面,babel7拥有着更快的速度,另外一方面,ts-loader默认是会读取ts-config的,因而每次构建的时候ts-loader都会去检查全有业务的类型(即便咱们只打包a业务)。react
须要注意的是升级babel7后,相关包名都变成@babel
前缀,而且stage-x
再也不支持(大概缘由是stage-x每一年都会有变,有的提案可能被废弃致使有的语法被移除,可是却不少项目可能使用了,换成单独配置相关语法特性),须要转对应。以及,@babel/preset-typescript
不在支持namespace
详情。webpack
迁移指南git
"@babel/core": "^7.0.0",
"@babel/plugin-proposal-class-properties": "^7.0.0",
"@babel/plugin-proposal-decorators": "^7.4.4",
"@babel/preset-env": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3",
复制代码
一版而言对于react项目使用上面的便可。es6
babel7新增了babel.config.js
型的配置,对比.babelrc
。.babelrc
是从每个文件向上查找配置的,babel.config.js
则不会。github
// babel.config.js
module.exports = function(api) {
api.cache(true)
const presets = [
[
'@babel/preset-env',
{
modules: false
}
],
'@babel/preset-react',
'@babel/preset-typescript'
]
const plugins = [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }]
]
return {
presets,
plugins
}
}
// webpack.js
...
{
test: /\.(jsx?|tsx?)$/,
exclude: ['node_modules'],
use: ['babel-babel']
},
...
复制代码
happypack 是 webpack 的一个插件,目的是经过多进程模型,来加速代码构建。(这个提高仍是很明显的)web
使用happypack
加载babel-loader
。typescript
let HappyPack = require('happypack')
let os = require('os')
let happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length })
...
{
test: /\.(jsx?|tsx?)$/,
exclude: ['node_modules'],
use: ['happypack/loader?id=babel']
},
...
...
plugins: [
new HappyPack({
id: 'babel',
loaders: [
{
loader: 'babel-loader'
}
],
threadPool: happyThreadPool
})]
...
复制代码
优化前json
dev babel6+ts-loader 56806ms
优化后 dev babel7+happypack 9576ms