Webpack配置文件基础使用

139 阅读3分钟

1、入口entry起点

entry: './src/index.js' //换成项目的入口文件

2、输出output

var {resolve} = require('path');
module.exports = {    output:{    filename: 'bundle.js', //输出的文件名
    //_dirname nodejs的变量,表示当前文件的目录绝对路径
    path: resolve(_dirname, 'build') //输出的路径
  }}

3. 样式资源处理:

(1)编译

less-loader:将less文件转化为css语法;

css-loader:将css文件转化为js语法,插入js文件中;

style-loader: 在head中创建style标签,将上面js例的css放入style标签里。

webpack.config.js

module.exports = {    entry: path.resolve(__dirname, './src/js/index.js'),    output: {        filename: "bundle.js",        path: path.resolve(__dirname, "build")    },    module: {        rules: [            {                 //匹配哪些文件                test: /\.less$/,                //排除哪些文件,代表忽略 node_modules中的less文件                exclude: /node_modules/,                 //使用哪些loader进行处理,use数组执行顺序:从右到左,从下到上                use: [                    //创建style标签,将js中的css资源插入head标签中                    'style-loader',                    //将css文件变成commonjs模块加载到js中,内容变为样式字符串                    'css-loader',                    //将less文件编译成css文件                    'less-loader'                ]             },            {                 //匹配哪些文件                test: /\.css$/,                //排除哪些文件,代表忽略 node_modules中的less文件                exclude: /node_modules/,                 //使用哪些loader进行处理,use数组执行顺序:从右到左,从下到上                use: [                    //创建style标签,将js中的css资源插入head标签中                    'style-loader',                    //将css文件变成commonjs模块加载到js中,内容变为样式字符串                    'css-loader'                ]             }        ]    },    postcss: [        require('autoprefixer') //调用autoprefixer插件,例如 display: flex    ],   mode: 'development'}

(2)提取

也可以使用**mini-css-extract-plugin**提取css到单独的css文件中。

var path = require('path')var webpack = require('webpack')var MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {    entry: path.resolve(__dirname, './src/js/index.js'),    output: {        filename: "bundle.js",        path: path.resolve(__dirname, "build")    },    module: {        rules: [            {                 // 匹配哪些文件                test: /\.css$/,                //排除哪些文件,代表忽略 node_modules中的less文件                exclude: /node_modules/,                 //使用哪些loader进行处理,use数组执行顺序:从右到左,从下到上                use: [                    //'style-loader':创建style标签,将js中的css资源插入head标签中                    //这个loader取代style-loader,作用:提取js中的css成单独文件                    MiniCssExtractPlugin.loader,                    //将css文件变成commonjs模块加载到js中,内容变为样式字符串                    'css-loader'                ]             }]    },    plugins: [        new MiniCssExtractPlugin({            filename: 'build.css' //对整合后的css文件进行重命名        })    ]}

(3)css兼容性处理postcss--->postcss-loader postcss-preset-env

  1.  webpack.config.js

module: {        rules: [            {                 test: /\.css$/,                exclude: /node_modules/,                 use: [                    MiniCssExtractPlugin.loader,                    'css-loader',                    {                        //css兼容性处理 postcss --->postcss-loader postcss-preset-env                        //帮助postcss找到package.json文件中的browserlist里的配置,
                        //通过配置加载指定的css兼容样式                        loader: 'postcss-loader',                        options: {                            ident: 'postcss',                            plugins: ()=>{                                require('postcss-preset-env')()                            }                        }                    }                ]             }]    },

   2. 在package.json中添加:browserslist

"browserslist": {
    "development": [ //开发环境 可以设置node环境变量进行修改:process.env.NODE_ENV = "development"      "last 1 chrome version", //兼容最近的一个chrome版本      "last 1 firefix version",      "last 1 safari version"    ],
   //生产环境,默认是生产环境,可以设置node环境变量进行修改:process.env.NODE_ENV = "production"
    "production": [       ">0.2%", //兼容98%的浏览器      "no dead", //不管已经死掉的浏览器      "no open_mini all" //不管open_mini类型的浏览器    ]  }

4. js语法检查:eslint, ``eslint-loader

webpack.config.js

module: {        rules: [            {                /**                 * 语法检查:只检查自定义源代码,不检查node_modules第三方代码                 * 设置检查规则:                 *      package.json中设置eslintConfig
                 *      "eslintConfig":{                 *       "extends": "airbnb-base"                 *     }                 *      下面使用airbnb规则, 下载eslint-config-airbnb-base                 *                  * */                test: /\.js$/,                exclude: /node_modules/,                 use: 'eslint-loader',                options:{                    fix:true //自动修复eslint错误                }            }        ]    },

5.js兼容性处理:babel-loader

(1) 基本js兼容性处理: @babel/preset-env

module: {        rules: [            {                 /**                 * js兼容性处理                 *  1\. 基本js兼容性处理: @babel/preset-env                */                test: /\.(js|jsx)$/,                 exclude: /node_modules/,                 use: 'babel-loader',                options:{                    //预设:只是Babel做什么样的兼容性处理                    preset: ['@babel/preset-env']                }            }]    },

(2) 全部js兼容性处理:@babel/polyfill 

  在js文件中使用import '@babel/polyfill'引入所有兼容性代码,会增加代码体积,不推荐

(3)按需对js做兼容性处理:core-js

module: {        rules: [            {                 /**                 * js兼容性处理                 *  1\. 基本js兼容性处理: @babel/preset-env, 只能转化基本语法,对于es6语法不能转换                 *  2\. 全部js兼容性处理: @babel/polyfill ,在js文件中使用import '@babel/polyfill'引入                 *     但是会将所有兼容性代码全部引入,会导致打包后代码体积过大                 *  3\. 按需对js做兼容性处理:core-js                */                test: /\.(js|jsx)$/,                 exclude: /node_modules/,                 use: 'babel-loader',                options:{                    //预设:只是Babel做什么样的兼容性处理                    preset: [                        '@babel/preset-env',                        {                            useBuiltIns: 'usage', //按需加载                            corejs: { //指定corejs版本                                version: 3                            },                            //指定兼容性做到浏览器的哪个版本                            target: {                                chrome: '60',                                firefox: '50'                                 //...                            }                        }                    ]                }            }]    },

6. 压缩js

mode:'production'
// 生产环境下会自动压缩js代码

7、html资源处理:html-webpack-plugin

var HtmlWebpackPlugin = require('html-webpack-plugin');
modules.export = {
    plugins: [        // html 模板插件 ,将打包后的bundle,css文件自动引入到新的html文件(以模板路径文件创建的html文件)中        new HtmlWebpackPlugin({            template: __dirname + './src/index.html',            minify:{ //压缩html文件                collapseWhitespace: true, //移除空格                removeComments: true //移除注释            }        })    ],
}

8. 图片资源处理:url-loader

  url-loader会默认使用es6模块化解析,而html-loader引入图片是common.js,所以同时使用会报错,所以将url-loader的option中的esModul:``false

module: {        rules: [            {                 test:/\.(png|gif|jpg|jpeg|bmp)$/i,                 loader:'url-loader',                options: {                    /**                     * 当发现图片大小小于8kb,就会被base64处理,也就是把图片转化为base64字符串                     * 优点: 减少请求数量                     * 缺点:图片体积会增加                     * */                    limit: 8*1024,
                    esModule: false, //关闭url-loader的es6模块化解析,使用commonjs解析
                    name: '[hash:10].[ext]' //给图片进行重命名,取图片hash值的前十位,ext代表图片文件原来的扩展名                }            }       ]    },

可以处理background:url('img.jpg'), 但是无法处理html中的img图片资源,

使用**html-loader**处理:

module:{
    rules: [
         {                test:/\.html$/,                //处理html文件中的img图片(负责引入img,从而能被url-loader进行处理)                loader: 'html-loader'          }
    ]
}

9、打包其他资源:file-loader

module:{
    rules: [
        {                exclude: /\.(css|js|html|less)$/,                 loader: 'file-loader',                option: {                    name: '[hash:10].[ext]'                }        }
    ]
}