webpack.config.js 文件的配置详情

6/10/2019 webpack.config.js

1.webpack-dev-server 安装 监听源码自动更新页面

npm i -D webpack-dev-server 或 yarn add -D webpack-dev-server
  1. html-webpack-plugin 安装 使用webpack的所有包插件
npm i -D html-webpack-plugin 或 yarn add -D html-webpack-plugin
  1. loader装载机
    • loader是编译webpack不能识别的文件,辅助webpack打包的方案,
    • loader写在module对象的rules数组里,每一个方案就是一个对象的形式写
    • loader的执行顺序是从右到左,从下到上
  • css.loader sytle-loader

css-loader用来解析css语法,style-loader用来将编译完的css代码插入到head标签中 4. 图片的打包

  • 图片的应用方式
    1. 样式里 css
    2. 页面里 html
    3. js创建插入到页面元素 使用可选的两种loader file-loader url-loader

* file-loader 和 url-loader都不能处理html中的img,要用一个第三方的html-withimg-loader来处理

  • 由于file-loader升级了,所有在配合html-withimg-loader时候会报错,需要在file-loader或url-loader里写个esMoule:false
  • url-loader比file-loader 多一个核心配置项:
    • limit用来控制文件的大小,单位是b,一般会把很小的图片变成base64格式插入页面
  1. babel-loader:将es6+ 变成浏览器可运行的es5代码 安装【webpack4.x】
npm install -D babel-loader @babel/core @babel/preset-env

用法:

module: {
  rules: [
    {
      test: /\.m?js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}
  1. less-loader 解析less语法的 less是css预处理器,让css编写公共性更好,让css写起来有js的风格 安装
npm i -D less-loader less
  1. sass-loader node-sass 用来解析scss文件的,scss和less都是css预处理器 安装命令
npm i -D sass-loader node-sass
  1. 字体的打包 file-loader 选项配置里所有的loader都支持一个outputPath配置项,是告诉被打包后的文件要去的目录 pubilcPath 公共的基础的路径,这个路径不会生成物理的文件夹,只会在代码中加上这个路径地址 pubilcpath一般用来设置cdn公共路径
 {

                // 查找图片字体
                test: /\.(ttf|eot|woff|woff2|svg)$/,//查找项目中的图片
                use: {
                    loader: 'file-loader',
                    options: {
                        esModule: false,
                    }
                }
            },
  1. clean-webpack-plugin 清除打包文件夹【dist】 每次打包的时候先把dist目录删除,目的就是删除dist里冗余的文件 删除的是output.path路径
    1. copy-webpack-plugin
  plugins: [
        // 将doc.md拷贝到dist目录
        new CopyPlugin([
            {
                from: './gitdoc.md', to: './docs'
            }
        ])
    ],

from 源文件 to拷贝的目的 可以将一些非项目文件,进行拷贝到特定的位置(默认是dist文件夹下) 8. banner-webapck-plugin 给打包后的文件插入版权信息

  1. postcss-loader autoprefixer 给css新特性加前缀 给css加前缀的loader配置,必须放在css-loader最下面,必须是第一个执行的 如果需要编译less和scss需要把postcss-loader放在预处理器loader的前面

  2. mini-css-extract-plugin 抽离css文件 这是一个插件,需要在plugins里使用,还需要css-loader前面使用,并且它和style-loader二选一

# opimization

  1. 压缩css文件 terser-webpack-plugin & optimize-css-assets-webpack-plugin 如果我们使用style-loader去处理css,默认css文件不会压缩, 如果使用css抽离,css文件不会压缩 terser-webpack-plugin & optimize-css-assets-webpack-plugin 去压缩css代码 会将css文件全部压缩成一行 ** 这两个插件不能再plugins里写,需要再opimization.minimizer里配置 实例代码:
 optimization: {
        // 配置压缩
        minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],

        // 代码分割只对多模块打包有用,多入口打包
        splitChunks: {
            // 分割代码js模块
            cacheGroups: {// 缓存组
                //   公共的模块common自定义的
                common: {
                    chunks: "initial", // 从入口文件开始找公共文件
                    minSize: 0,//被抽离的代码的大小 ,不为0字节的js文件
                    minChunks: 2//引用 2次及以上,会被抽离
                },
                //   私有的,被执行的逻辑js
                vendor: {
                    priority: 1, // 先执行这个,权重
                    test: /node_modules/, // vue jq 把依赖包这个抽离出来
                    chunks: "initial", //从入口文件开始找公共文件
                    minSize: 0,
                    minChunks: 2
                }
            }
        }

    }
  1. 抽离公共的js模块

  1. 全局注入第三方库
  plugins: [
        // 插件提供者 --- 设置全局插件依赖
        new webpack.ProvidePlugin({
            $: 'jquery',
            jQuery: 'jquery'
        })

    ],

首先需要引入webapck 配置好后,再src源码中就可以直接使用$('')了 13. cdn的使用-- 优化 add-asset-html-cdn-webpack-plugin 使用cdn,必须在module的配置 module.noParse

  1. 代理服务 devServer中的 proxy 配置 作用:前端可以请求proxy配置的接口,它可以帮我们实现跨域 原理:使用nodejs作为中间件去请求接口 同源策略,实际上前端的代码不存在跨域,是浏览器的规则,为什么nodejs没有跨域限制,因为nodejs运行在服务端,不受浏览器限制,所有后端语言都没有跨域的限制

15.( banner-plugin) new webpack.BannerPlugin(banner);

  1. 源码映射 devtool: "eval-source-map" 仅限在开发模式开启,生产模式不能

{
    devServer: {
    },
    module: {
        rules: []
    },
    optimization: {
    },
    // 开启源码映射,
    devtool: "eval-source-map"

};
  1. watch 实时的监听实时打包 只要开启了watch,那么npm run build 的时候程序会一直监听,只要我们改变了代码,就会自动打包成新的文件

// webpack是node写的。node的写法v4.x
// 引入path依赖
const path = require("path");
// 使用插件需要引入,使用loader不用引入
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
    // 1.模式 告诉webpack是生产环境还是开发环境 默认两种 production development 另 "none"  
    mode: 'production',
    // 2.入口文件  string | object | array  // 默认 ./src
    entry: "./src/index.js",
    // 3.输出,只可指定一个输出配置
    output: {
        filename: "bundle.[hash:4].js",//打包后的文件名
        path: path.resolve(__dirname, 'bulid'),//所有输出文件所在的目录 必须是绝对路径
        library: "MyLibrary", // string //导出库的名称
        libraryTarget: "umd", // universal module definition // 导出库的类型
    },
    // 4.开发服务器的配置
    devServer: {
        port: 3000,//端口
        // proxy: { // 代理url
        //     '/api': 'http://localhost:3000'
        // },
        progress: true, //进度条
        contentBase: "./bulid",// 以build为需要监听的目录 // 或绝对路径 path.resolve(__dirname, './webRoot'),
        open: true,  //自动打开浏览器
        compress: true, //  启动gzip压缩
        historyApiFallback: true, // html在404,对象为多个路径
        hot: true, // 热模块替换。取决于HotModuleReplacementPlugin
        https: false,
        noInfo: true,
    },
    // 5.模块 如何处理项目中不同ww类型的模块
    module: {
        // 规则 用于规定在不同模块被创建时如何处理模块的规则数组
        rules: [
            {
                test: /\.jsx?$/, //匹配特定文件的正则表达式或正则表达式数组
                include: [ //规则适用的范围
                    path.resolve(__dirname, "app")
                ],
                exclude: [ //规则排除的范围
                    path.resolve(__dirname, "app/demo-files")
                ],
                issuer: { test, include, exclude },
                enforce: "pre",
                enforce: "post",
                loader: "babel-loader", //加载器
                options: { //转义
                    presets: ["es2015"]
                },
            },
            /*
            css-loader 主要负责解析@import这种语法的
            style-loader 主要负责把css插入掉head标签中
            loader的特点:希望单一
            loader的用法:字符串的形式只能用一个loader用多个要用数组
            loader的执行顺序是从右到左
            loader还可以写成对象的形式
            */
            {
                test: /\.css$/,//匹配特定文件的正则表达式或正则表达式数组
                use: [{
                    loader: 'style-loader',
                    // options:{'传参用'}
                }, 'css-loader']
            },
            // { test: /\.css$/, use: ['style-loader', 'css-loader'] }
        ]
    },
    plugins: [
        //放着所有的webpack插件
        new HtmlWebpackPlugin({
            title: "webpack第一天",//生成html后标题内容
            template: "./src/index.html", //指定模板文件
            filename: "index.html",//或绝对路径path.resolve(__dirname, "./webRoot/index.html"),//生成html后存放的路径和名称
            minify: {
                removeAttributeQuotes: true,//去双引号
                collapseWhitespace: true,//去空格
            },
            hash: true //使用hash编码
        })
    ],
    //用来设置引用模块
    resolve: {
        extensions: [".ts", ".js"] ,// 告诉 webpack 凡是ts、js文件结尾的文件都可以作为模块使用
        alias:{
          'vue$':'vue/dist/vue.esm.js',//修改模式 runtime-only
        }
    }
}
最后提交: 7/15/2022, 10:42:12 AM