1)创建好webpack.config.js文件
2)配置entry,output配置项
3)进行loader配置:配置样式文件处理、配置js兼容
① 打包样式资源、处理css兼容、生成单独css文件、压缩css
打包css
打包less
涉及的依赖:
mini-css-extract-plugin:mini-css-extract-plugin中的loader用于将js文件中的css字符串
css-loader:用于将css文件转成字符串插入js文件中
postcss-loader:用于处理css兼容问题
less-loader:用于将less文件转为css文件
提取成单独文件,在plugins中进行配置mini-css-extract-plugin对象,可以将输出的单独
文件进行配置输出的css文件路径。并且各个loader引入是有顺序的
使用optimize-css-assets-webpack-plugin进行压缩
② 打包并压缩html资源
涉及的插件:
html-webpack-plugin:通过该配置项将打包后的js/css文件引入到指定需要复制的html
文件中。并通过minify配置项对html文件进行压缩。
③打包图片、其它资源
涉及的依赖:
file-loader:用于打包输出其它资源文件、作为url-loader使用的前提。
url-loader:用作打包图片资源,并可以通过配置项对小于指定大小的图片进行base64
压缩。
html-loader:处理引入html中引入的图片资源,从而能被url-loader处理。
④引入eslint-loader统一开发规范(使用推荐的airbnb)
涉及的依赖:
eslint:作为使用eslint-loader的前提
eslint-loader:对eslint进行配置,检查js语法规范
eslint-config-airbnb-base:推荐使用的eslint代码规范
eslint-plugin-import:使用的前提条件
⑤ 处理js兼容性问题(使用按需加载)、并进行js代码压缩
babel:使用babel-loader的前提
babel-loader:做js兼容
@babel/preset-env:babel的预设,做基本兼容
core-js:ie浏览器无法兼容es6语法,可以使用core-js进行兼容
将mode改为production进行js代码压缩
- const { resolve } = require("path");
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- const HtmlWebpackPlugin = require("html-webpack-plugin");
- const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin");
-
- const commonCssLoader = [
- MiniCssExtractPlugin.loader,
- "css-loader",
- {
- loader: "postcss-loader",
- options: {
- ident: "postcss",
- plugins: () => [require('postcss-preset-env')()]
- }
- }
- ]
- module.exports = {
- entry: "./src/index.js",
- output: {
- filename: "js/built.js",
- path: resolve(__dirname, "build")
- },
- module: {
- rules: [
- {
- test: /\.css$/,
- use: [...commonCssLoader]
- },
- {
- test: /\.less$/,
- use: [...commonCssLoader, "less-loader"]
- },
- {
- test: /\.(jpeg|jpg|png|gif)$/,
- loader: 'url-loader',
- options: {
- limit: 8 * 1024,
- name: '[hash:10].[ext]',
- esModule: false,
- outputPath: 'imgs'
- }
- },
- {
- test: /\.html$/
- loader: 'html-loader'
- },
- {
- exclude: /\.(html|less|css|js|jpeg|jpg|png|gif)$/,
- loader: 'file-loader',
- options: {
- name: '[hash:10].[ext]',
- outputPath: 'media'
- }
- },
- /*
- 正常来讲,一个文件只能被一个loader处理。
- 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
- 先执行eslint 在执行babel
- */
- {
- // 在package.json中eslintConfig --> airbnb
- test: /\.js$/,
- exclude: /node_modules/,
- // 优先执行
- enforce: 'pre',
- loader: 'eslint-loader',
- options: {
- fix: true
- }
- },
- {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: 'babel-loader',
- options: {
- presets: [
- [
- "@babel/preset-env",
- {
- // 按需加载
- useBuiltIns: "usage",
- // 指定corejs的版本
- corejs: {
- version: 3
- },
- // 指定兼容性做到哪个版本浏览器
- targets: {
- chrome: '60',
- firefox: '60',
- ie: '9',
- safari: '10',
- edge: '17'
- }
- }
- ]
- ]
- }
- }
- ]
- },
- plugins: [
- new HtmlWebpackPlugin({
- template: "./src/index.html",
- minify: {
- // 移除空格
- collapseWhitespace: true,
- // 移除注释
- removeComments: true
- }
- }),
- new MiniCssExtractPlugin({
- filename: "css/built.css"
- }),
- new OptimizeCssAssetsWebpackPlugin()
- ],
- mode: "production"
- }