zoukankan      html  css  js  c++  java
  • React从入门到放弃(1):webpack4简介

    接触webpack是好久之前的事情了,最近看了下webpack没想到都到4了。

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).

    会创建1个依赖关系图(dependency graph),包含所有依赖的模块,然后将模块打包成1个或多个bundle.

    webpack4 仍然支持高度可配,但完全可以不用配置文件了(基于mode)。

    安装

    淘宝源:npm config set registry https://registry.npm.taobao.org

    升级npm:npm i npm -g

    安装webpack:npm i -D webpack webpack-cli webpack-dev-server

    运行webpack:npx webpack(Node 8.2+ 版本提供的npx命令)

    基本特性

    核心配置:

    • 入口(entry):
    • 输出(output):
    • loader:
    • 插件(plugins):

    Entry

    入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。

    可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src/index.js

    webpack.config.js

    module.exports = {
        entry: {
            main: './src/index.js'
        },
    };
    

    Output

    output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为./dist/[name].js

    webpack.config.js

    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].js'
      }
    };
    

    Loader

    loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。

    loaders 有2个核心参数:

    1. test 属性,用于标识出需要转换的某个或某些文件。
    2. use 属性,表示进行转换时,应该使用哪个 loader。
    const path = require('path');
    
    const config = {
      output: {
        filename: 'bundle.js'
      },
      module: {
        rules: [
          { test: /.txt$/, use: 'raw-loader' }
        ]
      }
    };
    
    module.exports = config;
    

    Plugins

    插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

    webpack.config.js

    const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
    const webpack = require('webpack'); // 用于访问内置插件
    
    const config = {
      module: {
        rules: [
          { test: /.txt$/, use: 'raw-loader' }
        ]
      },
      plugins: [
        new webpack.optimize.UglifyJsPlugin(),
        new HtmlWebpackPlugin({template: './src/index.html'})
      ]
    };
    
    module.exports = config;
    

    Mode

    通过选择 development 或 production 之中的一个,来设置 mode 参数

    webpack.config.js

    module.exports = {
      mode: 'production'
    };
    

    mode.js

    // webpack.development.config.js
    module.exports = {
    + mode: 'development'
    - plugins: [
    -   new webpack.NamedModulesPlugin(),
    -   new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }),
    - ]
    }
    
    // webpack.production.config.js
    module.exports = {
    +  mode: 'production',
    -  plugins: [
    -    new UglifyJsPlugin(/* ... */),
    -    new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
    -    new webpack.optimize.ModuleConcatenationPlugin(),
    -    new webpack.NoEmitOnErrorsPlugin()
    -  ]
    }
    

    常用插件

    HtmlWebpackPlugin:

    Options

    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    new HtmlWebpackPlugin({ template: 'src/index.html', minify: true, hash: true })
    

    CleanWebpackPlugin:

    const CleanWebpackPlugin = require('clean-webpack-plugin');
    
    new CleanWebpackPlugin(['dist'])
    

    MiniCssExtractPlugin(ExtractTextPlugin):

    new MiniCssExtractPlugin({ filename: "[name].css",chunkFilename: "[id].css" })
    
    module: {
        rules: [{
            test: /.css$/,
            use: [
                MiniCssExtractPlugin.loader,
                'css-loader'
            ]}
        ]
    }
    

    SplitChunksPlugin:

    module.exports = {
        mode: 'development',
        entry: {
            main: './src/index.js',
            vendors: 'lodash'
        },
        optimization: {
            splitChunks: {
                cacheGroups: {
                    vendors: {
                        test: /[\/]node_modules[\/]/,
                        name: "vendors",
                        chunks: "initial"
                    }
                }
            }
        }
    }
    

    配置示例

    package

    package.json

    {
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "start": "webpack-dev-server --open",
        "build": "webpack --config webpack.prod.js"
      },
      "devDependencies": {
        "babel-loader": "^7.1.4",
        "babel-preset-react": "^6.24.1",
        "babel-plugin-import": "^1.7.0",
        "clean-webpack-plugin": "^0.1.19",
        "css-loader": "^0.28.11",
        "html-webpack-plugin": "^3.2.0",
        "mini-css-extract-plugin": "^0.4.0",
        "webpack": "^4.8.3",
        "webpack-cli": "^2.1.3",
        "webpack-dev-server": "^3.1.4"
      },
      "dependencies": {
        "antd": "^3.5.2",
        "babel-plugin-syntax-dynamic-import": "^6.18.0",
        "express": "^4.16.3",
        "lodash": "^4.17.10",
        "react": "^16.3.2",
        "react-dom": "^16.3.2",
        "react-loadable": "^5.4.0",
        "react-redux": "^5.0.7",
        "react-router": "^4.2.0",
        "react-router-dom": "^4.2.2",
        "redux": "^4.0.0",
        "redux-logger": "^3.0.6",
        "redux-promise": "^0.6.0",
        "redux-saga": "^0.16.0",
        "redux-thunk": "^2.2.0"
      }
    }
    

    开发环境

    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    const path = require('path');
    
    module.exports = {
        mode: 'development',
        entry: {
            main: './src/index.js',
        },
        devtool: 'inline-source-map',
        devServer: {
            contentBase: './dist'
        },
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: '[name].js',
        },
        module: {
            rules: [{
                test: /.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            }, {
                test: /.(js|jsx)$/,
                loader: 'babel-loader',
                options: {
                    presets: ['react'],
                    plugins: [
                        ["import", { "libraryName": "antd", "style": "css" }]
                    ]
                },
                exclude: /node_modules/
            }]
        },
        plugins: [
            new CleanWebpackPlugin(['dist']),
            new HtmlWebpackPlugin({ minify: true, hash: true }),
            new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" })
        ],
        optimization: {
            splitChunks: {
                cacheGroups: {
                    common: {
                        test: /[\/]node_modules[\/]/,
                        name: "common",
                        chunks: "initial",
                        enforce: true
                    },
                }
            }
        }
    };
    

    生产环境

    const CleanWebpackPlugin = require('clean-webpack-plugin');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
    const path = require('path');
    
    module.exports = {
        mode: 'production',
        entry: {
            main: './src/index.js',
        },
        devtool: 'source-map',
        devServer: {
            contentBase: './dist',
            host: '192.168.0.75'
        },
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: '[name].js',
        },
        module: {
            rules: [{
                test: /.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            }, {
                test: /.(js|jsx)$/,
                loader: 'babel-loader',
                options: {
                    presets: ['react'],
                    plugins: []
                },
                exclude: /node_modules/
            }]
        },
        plugins: [
            new CleanWebpackPlugin(['dist']),
            new HtmlWebpackPlugin({ template: 'src/index.html', minify: true, hash: true }),
            new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" })
        ],
        externals: {
            lodash: '_',
            react: 'React',
            'react-dom': 'ReactDOM',
            antd: 'antd'
        },
        optimization: {
            splitChunks: {
                cacheGroups: {
                    common: {
                        test: /[\/]node_modules[\/]/,
                        name: "common",
                        chunks: "initial",
                        enforce: true
                    },
                }
            }
        }
    };
    
  • 相关阅读:
    阶梯式测试
    websocket协议
    性能指标
    环境变量
    解密断言+参数写入文本
    将参数进行URL编码
    日志级别
    对返回结果进行断言
    python小题目:循环/函数
    如果使用JSON提取器 和正则提取器
  • 原文地址:https://www.cnblogs.com/neverc/p/9044864.html
Copyright © 2011-2022 走看看