使用glob
插件,glob.sync(path.join(__dirname ,"./src/*/index.js"))
方法会匹配src
目录下
所有等文件夹中等index.js入口文件(开发按照约定,入口文件为index.js
)
HtmlWebpackPlugin
new HtmlWebpackPlugin({
template: path.join(__dirname, `src/${pageName}/index.html`),
filename: `${pageName}.html`,
chunks: [pageName],
inject: true, // 注入css/js
minify: { // 模板格式设置
html5:true,
collapseWhitespace: true ,
preserveLicenseComments: false ,
minifyJS: true ,
minifyCSS: true,
removeComments: true,
}
})
需要使用 @babel/core @babel/preset-react @babel/preset-env babel-loader
需要新建.babelrc
文件且加入
{ "presets": [ "@babel/preset-env", "@babel/preset-react" ] }
webpack 4 版本自带了
UglifyJsPlugin
插件,会对js进行压缩
压缩cssOptimizeCSSAssetsPlugin
,需要用到cssnano
库
new OptimizeCSSAssetsPlugin({ // 压缩css
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano')
}),
如果
module.rules
中使用了style-loader css-loader less-loader
此时会将css压缩至css中
可通过MiniCssExtractPlugin
生成单独css文件
css自动补全前缀postcss-loader
和autoprefixer
{
loader: 'postcss-loader',
options: {
plugins: () => [
require('autoprefixer')({ // 自动补全
overrideBrowserslist:["last 2 version", ">1%", 'ios 7'],
})
]
}
}
移动端rem单位转换px2rem-loader
,同时通过raw-loader
包内联静态资源文件引入node_modules/lib-flexible/flexible.js
(需下载lib-flexible
库,且需要安装到正式环境到依赖yarn add lib-flexible -S
)
{
loader: "px2rem-loader",
options: {
remUnit: 75, // 1rem = 75px
remPrecesion: 8, // px转换rem到小数位
}
}
在index.html
模板页引入内联资源
// 静态资源导入
<script type="text/javascript">
// 静态资源导入
${require('raw-loader!babel-loader!../../node_modules/lib-flexible/flexible.js')}
</script>
<head>
<!-- 静态资源导入 -->
${require('raw-loader!./meta.html')}
</head>
hash
一旦文件改变,重新打包将会导致整个项目hash改变,整个项目的缓存将失效
chunkhash
根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值,在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响。 但是这样又有一个问题,因为我们是将样式作为模块import到JavaScript文件中的,所以它们的chunkhash是一致的
contenthash
contenthash是针对文件内容级别的,只有你自己模块的内容变了,那么hash值才改变
解决办法: 对入口文件使用chunkhash
,对css文件使用contenthash
,如果对css使用文件指纹,需要取消使用style-loader
,因为前者是生成hash css文件,后者是将css打入html中
output: {
path: path.join(__dirname, 'dist'),
filename: '[name]_[chunkhash:8].js' // chunkhash
},
plugins:[
new MiniCssExtractPlugin({
filename: '[name]_[contenthash:8].css' // contenthash
})
]
module: {
rules:[
{
test: /.less$/,
use:[
// 'style-loader',// 将css插入到html style标签,如果要使用contenthash生成css文件,需要注释
MiniCssExtractPlugin.loader ,
'css-loader',
'less-loader'
]
}
]
}
url-loader
```
rules: [
{
test: /.(png|jpg|gif)$/i,
use: [{
loader: 'url-loader',
options: {
limit: 8192, // 限制大小
},
}],
},
]##### source-map 开发环境开启,线上关闭
配置详见:[webpack devtool](https://www.webpackjs.com/configuration/devtool/)
##### 辅助工具
- `CleanWebpackPlugin` 构建完成之前删除dist目录
plugins:[ new CleanWebpackPlugin() ]
##### 基础库分离
- 使用`SplitChunksPlugin`插件将`React React-dom`通过CDN引入
- `chunks` 参数说明
- async 只分离异步引入的库
- initial 只分离同步引入的库
- all 分离引入的库
配置详见: [split-chunks-plugin/](https://www.webpackjs.com/plugins/split-chunks-plugin/#optimization-splitchunks)
plugins:[ optimization : {
splitChunks: {
cacheGroups: {
commons: {
test: /(react|react-dom)/,
name: "vendors",
chunks: 'all'
}
}
}
} 或者 optimization : {
splitChunks: {
minSize: 0, // 引用的模块大小,
cacheGroups: {
commons: {
// test: /(react|react-dom)/,
name: "commons",
chunks: 'all',
minChunks: 3, // 最少引用了两次
}
}
}
} ```
一个模块有多个方法,只要引用了一个方法,这个文件都会被打包到bundle中,tree shaking
就是只把引用了到方法打入bundle中,没用到的方法会在uglify
阶段去除掉
使用:
webpack
默认支持,在mode:production
的情况下默认开启,在.babelrc
文件中设置modules:false
即可
要求
必须是es6
的语法