列举的例子都是使用webpack4.x版本
loader
style-loader和css-loader
- style-loader
通过注入<style>标签将CSS添加到DOM
- css-loader
用于解析 @import 和 url() ,会 import/require() 后再解析(resolve)它们。
所以需要先用css-loader将样式解析后再交由style-loader注入标签添加到DOM。
sass-loader
将scss文件的样式编译成css。loader是从下往上执行的,先将sass文件编译成css文件然后交由css-loader处理
{test: /\.scss$/,use: ['style-loader','css-loader','sass-loader']},
url-loader和file-loader
- url-loader
将文件加载为base64编码的URL。如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl。相当于把图片数据翻译成一串字符。再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。
- file-loader
解决引用路径的问题,拿background样式用url引入背景图来说,我们都知道,webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的,而不是相对于原始css文件所在的路径的。这就会导致图片引入失败。这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。
{test: /\.(png|svg|jpg|gif)/,use: [{loader: "url-loader",options: {limit: 10000,outputPath: 'images',esModule: false}},]},
为什么只用了url-loader?
我们需要了解file-loader和url-loader的关系。url-loader和file-loader是什么关系呢?简单地说,url-loader封装了file-loader。url-loader不依赖于file-loader,即使用url-loader时,只需要安装url-loader即可,不需要安装file-loader,因为url-loader内置了file-loader。
通过上面的介绍,我们可以看到,url-loader工作分两种情况:
1.文件大小小于limit参数,url-loader将会把文件转为DataURL(Base64格式);
2.文件大小大于limit,url-loader会调用file-loader进行处理,参数也会直接传给file-loader。
也就是说,其实我们只安装一个url-loader就可以了。
html-withimg-loader
解决了html文件引用图片的路径问题,引入后可在html页面中正常引用图片
{test: /\.(htm|html)$/i,use: ['html-withimg-loader']}
需注意的是file-loader新版本默认使用了esModule语法,需要将其关闭。但是我们如果使用的是url-loader也是直接在options中设置esModule为false
{loader: "url-loader",options: {limit: 10000,outputPath: 'img/',esModule: false}}
plugin
HtmlWebpackPlugin
HtmlWebpackPlugin简化了HTML文件的创建,以便为你的webpack包提供服务。这对于在文件名中包含每次会随着编译而发生变化哈希的 webpack bundle 尤其有用。 你可以让插件为你生成一个HTML文件,使用lodash模板提供你自己的模板,或使用你自己的loader。
const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {entry: 'index.js',output: {path: __dirname + '/dist',filename: 'index_bundle.js'},plugins: [new HtmlWebpackPlugin()]}
CleanWebpackPlugin
用于清空原有打包目录下的内容
const {CleanWebpackPlugin} = require('clean-webpack-plugin');plugins:[new CleanWebpackPlugin(),]
提取css单独打包
extract-text-webpack-plugin
在webpack4中不推荐使用,会报错。官方也推荐使用mini-css-extract-plugin
mini-css-extract-plugin
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {module:{rules:[{test: /\.scss$/,use: [{loader: MiniCssExtractPlugin.loader,options: {hmr: process.env.NODE_ENV === 'development', // 是否热加载publicPath:'../', // 解决背景图片路径问题},},'css-loader','sass-loader']}]},plugins: [new MiniCssExtractPlugin({filename:"./css/[name].css",})],}
copy-webpack-plugin
将静态资源打包到指定路径,高版本有问题,采用的是v4.0.1
const CopyWebpackPlugin = require('copy-webpack-plugin');plugins: [new CopyWebpackPlugin([{from: path.resolve(__dirname, './static'),to: 'static',ignore: ['.*']}])]
uglifyjs-webpack-plugin
webpack4在 production 模式下会自动压缩JS
其他
webpack-merge
用于合并webpack的配置项,相关文档
babel
安装
npm install @babel/polyfill @babel/preset-env --save-dev
然后在根目录下创建 babel 配置文件 .babelrc :
{"presets": [["@babel/preset-env",{"useBuiltIns": "usage","targets": {"browsers": ["last 2 versions", "ie >= 10"]}}]]}
