webpack4学习笔记
最近开始学习使用webpack打包工具,由于之前都是使用vue自带的webpack脚手架,使用比较方便,也没有遇到什么问题,后边需要在一些jquery的项目中使用webpack,因此重头学习一下webpack,并记录遇到的问题。
首先通过webpack官网的快速开始进行学习,简单的demo按照教程,一步步下来并没有什么问题。后来将旧项目迁移,使用webpack,遇到了一些问题,记录如下:
(*以下设置均在webpack.config.js中完成)
合并打包压缩css:
使用“extract-text-webpack-plugin”,注意:该插件在webpack4.0以上会报错,需要 npm install extract-text-webpack-plugin@next 以下载兼容版本
引用静态文件:
项目中需要引用一下常规的静态文件,在根目录创建一个static的文件夹,使用“copy-webpack-plugin”,在plugins添加如下配置
new CopyWebpackPlugin([{ from: path.resolve(__dirname, 'static'), to: path.resolve(__dirname, 'dist/static'), ignore: ['.*'], }])
即可将该文件夹下的文件复制到dist之下
自定义入口html文件:
使用“html-webpack-plugin”,在plugins中配置如下代码中的template的参数
new HtmlWebpackPlugin({ title: 'mobile', template:'./src/mobileContent.html', hash:true, filename:"mobileContent.html" }),
引用图片:
使用url-loader
(1)设置limit参数,可以使对应体积的图片使用base64编码进行加载; (2)设置outputPath,设置图片输出路径; (3)设置context和name,是由于在原img文件夹中有子文件夹,为使打包后的img文件夹仍然保持原结构,设置name时加上[path],并且通过修改context来设置path的相对路径; { test:/\.(png|jpg|jpeg|gif|svg)$/, use:[ { loader:"url-loader", options:{ limit:1000, //表示低于10000字节(10K)的图片会以 base64编码 outputPath:'img', context:"src/img", //path的相对路径,该设置为保留img下的子文件夹 name:'[path][name].[ext]?[hash]' } } ] }, (4)为打包HTML中img标签所引用的图片,需要使用“html-loader”,并在plugins中增加以下代码 { test: /\.(html)$/, use: { loader: 'html-loader', options: { attrs: ['img:src','img:data-src','video:poster'], } } }, (5)通过css引用图片和html引用图片后,可能会遇到图片路径问题,总是会有一方的图片引用失败,可以对css-loader进行设置,设置其publicPath属性。 { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: "css-loader", publicPath:"../" }) }
引用字体文件:
使用file-loader插件,在plugins中做如下配置,将字体文件输出在fonts文件夹之下 { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [{ loader:'file-loader', options:{ outputPath:'fonts' } }] },
多入口应用:
首先设置多个入口,针对pc页面和mobile页面的两个入口js进行设置; entry: { mobile: ['./src/mobile.js',], pc: ['./src/pc.js'], }, 对于html页面入口通过“html-webpack-plugin”实现,只需要在plugins中设置两次即可 new HtmlWebpackPlugin({ title: 'mobile', template:'./src/mobileContent.html', hash:true, filename:"mobileContent.html", }), new HtmlWebpackPlugin({ title: 'pc', template:'./src/pcContent.html', hash:true, filename:"pcContent.html", }),