webpack初体验

138 阅读2分钟

五个概念:entry(入口),output(出口0) ,loader(处理非js文件) ,Plugin(插件) ,mode(模式)

安装:

npm init
npm i webpack webpack_cli -g(全局安装)
npm i webpack webpack_cli -D(本地安装)

简单指令

webpack ./(入口url) -o ./(出口url) --mode=development

基本代码

在src层级创建webpack.config.js
import resolve = require('path')(引用path中的path)
  import MiniCssExtractPlugin = require('mini-css-extract-plugin')

entry(入口):

    module.exports = {
      entry: './path/to/my/entry/file.js',
    };
    或者
    module.exports = {
      entry: {
        main: './path/to/my/entry/file.js',
      },
    };
    **我们也可以将一个文件路径数组传递给 `entry` 属性,这将创建一个所谓的  *"multi-main entry"* 。
    在你想要一次注入多个依赖文件,并且将它们的依赖关系绘制在一个 "chunk" 中时,这种方式就很有用。**
    module.exports = {
      entry: ['./src/file_1.js', './src/file_2.js'],
      output: {
        filename: 'bundle.js',
      },
    };
    **当你希望通过一个入口(例如一个库)为应用程序或工具快速设置 webpack 配置时,单一入口的语法方式是不错的选择。
    然而,使用这种语法方式来扩展或调整配置的灵活性不大。**
    入口方式[:](https://webpack.docschina.org/concepts/entry-points/)

output(出口)

    module.export = {
        output : {
            filename : filename.js,
            path : (reslove , dirname)
        }
    } 
    **如果有多个入口文件**
    module.export = {
        entry : {
            app : (url),
            search : (url)
        },
        output : {
            filename : [name].js,
            path : (reslove , dirname)
        }
    }
    高级见[:](https://webpack.docschina.org/concepts/output/#advanced)

loader(处理文件,自下向上,自右向左):

**例如,你可以使用 loader 告诉 webpack 加载 CSS 文件,或者将 TypeScript 转为 JavaScript。
为此,首先安装相对应的 loader:**
    npm i style-loader css-loader less-loader --save-dev / -D
    
    module.export = {
        module : {
            rules:[
                {
                    test : /\.css$/,
                    use : ['style-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')()
                                }
                            }
                        }
                    ]
                },
                {
                    test : /\.less$/,
                    use : ['style-loader','css-loader','less-loader']
                }
            ]
        }
    }
    
    **处理图片:(url-loader依赖于file-loader)**
    {
        test : /\.(jpg|png|gif)$/,
        loader : url-loader,
        options : {
            //limit:发现超过8kb就会被base64处理,变成base64的字符串
            limit:8*1024
            //url-loader默认使用es6模块化,改成commonJS解析,不使用会使下面报错
            esModule : false
        }
    },
    {
        test : /\.html$/ (处理img 标签),
        loader : html-loader
    }
    **其他资源,不用更改直接引出**
    {
        exclude : /\.(...)$/,
        loader : file-loader,
        options : {
            //取名字前十位
            name : '[hash:10].[ext]'
        }
    }
详见[:](https://webpack.docschina.org/concepts/loaders/)

Plugin(插件)

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 访问内置的插件
const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    filename: 'my-first-webpack.bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /.(js|jsx)$/,
        use: 'babel-loader',
      },
    ],
  },
  plugins: [
    new webpack.ProgressPlugin(),
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    //替代style-loader , 变为~.loader
    new MiniCssExtractPlugin({ filename : 'css/bulit.css' })
  ],
};
详见[:](https://webpack.docschina.org/concepts/plugins/)

热更新(dev-server)

自动打开客户端,刷新,用来自动化服务器 ,只会在内存中编译打包,不会输出
module.export = {
    ...,
    devServer : {
        //项目路径
        contentBase: reslove(__dirname , dirname),
        //使用gzip压缩
        compress : true,
        //端口
        port : 3000,
        //自动打开
        open : true
    }
}
详见[:](https://webpack.docschina.org/concepts/hot-module-replacement/)

基础模板形状

module.export = {
    entry : {
        ...
    },
    output : {
        ...
    },
    module : {
        rules : [
            {
                test : /\.()$/,
                user:[]或者loader:(...)
            }
        ]
    },
    plugins:{
        new ...(),
        new ...()
    }
    mode : development(更大) / production(更小),
    devServer : {
        contentBase: reslove(__dirname , dirname),
        compress : true / false,
        port : 3000 / ....
        open : true / false
    }
}
//在package.json中配置
注:"browserlist" : {
        //设置环境变量node:process.env.NODE_ENV = 'development' 加载module.export前
        "development" : [
            "last 1 chrome version"
        ],
        production : [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ]
    }