- 优化babel-loader
- happyPack
- IgnorePlugin
- paralleUglifyPlugin
- noParse
- 自动刷新
1 happypack多进程打包
- js单线程,开启多进程打包
- 提高构建速度(特别是多核CPU)
const HappyPack = require('happypack')
module.exports = smart(webpackCommonConf, {
mode: 'production',
output: {
// filename: 'bundle.[contentHash:8].js', // 打包代码时,加上 hash 戳
filename: '[name].[contentHash:8].js', // name 即多入口时 entry 的 key
path: distPath,
// publicPath: 'http://cdn.abc.com' // 修改所有静态文件 url 的前缀(如 cdn 域名),这里暂时用不到
},
module: {
rules: [
// js
{
test: /\.js$/,
// 把对 .js 文件的处理转交给 id 为 babel 的 HappyPack 实例
use: ['happypack/loader?id=babel'],
include: srcPath,
// exclude: /node_modules/
},
]
},
plugins:[
// happyPack 开启多进程打包
new HappyPack({
// 用唯一的标识符 id 来代表当前的 HappyPack 是用来处理一类特定的文件
id: 'babel',
// 如何处理 .js 文件,用法和 Loader 配置中一样
loaders: ['babel-loader?cacheDirectory']
}),
]
})
关于开启多进程
- 项目较大,打包较慢,开启多进程能提高速度
- 项目较小,打包较快,开启多进程会降低速度(进程开销)
- 按需使用
2. IgnorePlugin
- 这是webpck的内置组件
- 这个插件的作用是:
忽略第三方包指定目录,让这些指定目录不要被打包进去
- 例子:比如我们要使用
moment
这个第三方依赖库,该库主要是对时间进行格式化,并且支持多个国家语言
moment包打包的问题
import moment from 'moment'
//设置语言
moment.locale('zh-cn');
let r = moment().endOf('day').fromNow();
console.log(r);
这样打印出来的就是中文的时间,因为我在使用这个API的时候,前面设置了语言类型moment.locale为中文zh-cn。但是,虽然我设置了语言为中文,但是在打包的时候,是会将所有语言都打包进去的。这样就导致包很大,打包速度又慢所以,最好能够少打包一些没用的依赖目录进去而moment的包含’./locale/‘该字段路径的文件目录就是各国语言的目录,比如’./locale/zh-cn’就是中文语言
plugins:[
//moment这个库中,如果引用了./locale/目录的内容,就忽略掉,不会打包进去
new Webpack.IgnorePlugin(/\.\/locale/,/moment/),
]
问题存在并解决
import moment from 'moment'
//设置语言
//手动引入所需要的语言包
import 'moment/locale/zh-cn';
moment.locale('zh-cn');
let r = moment().endOf('day').fromNow();
3. ParallelUglifyPlugin
module.exports = {
plugins: [
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
compress: {
warnings: false
}
}),
]
}
4. noParse
- 我们一般引用jquery,可以如下引用
import jq from 'jquery'
- 对于上面的解析规则:当解析jq的时候,会去解析jq这个库是否有依赖其他的包
- 我们对类似jq这类依赖库,一般会认为不会引用其他的包(特殊除外,自行判断)。所以,对于这类不引用其他的包的库,我们在打包的时候就没有必要去解析,这样能够增加打包速率。
- 所以,可以在webpack的配置中增加noParse属性(以下代码只需要看module的noParse属性)
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode:'development',
entry:'./src/index.js',
output:{
filename:'bundle.js',
path:path.resolve(__dirname,'dist')
},
module:{
noParse:/jquery/,//不去解析jquery中的依赖库
},
}