• Wenpack 打包 15. 生产环境配置(提取JS中的CSS、压缩CSS、压缩html、eslint语法检查...)


    这里综上所述,多种文件处理打包

    1.文件结构

     2.代码

    a.css

    #box1 {
        width: 100px;
        height: 100px;
        background-color: pink;
        display: flex;
        backface-visibility: hidden;
    }

    b.css

    #box2 {
        width: 200px;
        height: 200px;
        background-color: deeppink;
    }

    iconfont.css

    @font-face {font-family: "iconfont";
      src: url('../media/iconfont.eot?t=1581833245354'); /* IE9 */
      src: url('../media/iconfont.eot?t=1581833245354#iefix') format('embedded-opentype'), /* IE6-IE8 */
      url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAO0AAsAAAAACFwAAANlAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDMgqDaIM0ATYCJAMUCwwABCAFhG0HWhtSBxHVm8PIfhzGMck6c2bkTSjPG/sePF+69P3d1UUnhRgUQqyA5BBPz9SlMjBVQJUnnZ0EgFmbnT6jIgzdMR78N0/ZUHpuv/3PMeOtBfPb1iBTzAoK2hvgKIFms6qLCLI7kBP1G8auvIibIYBDX0Yji5as2oSNwdgkgJw6fnQ/dsqIqakUbIRAyYkGeY6FrR6oVOCZ//tSz0SxQWFpjFutO7L4EF7VpKpF2v/v79I+/nh2gJ0GGhgNGJALpc5T6DA5Go2jzDd4gIONQo01bWaVV7Xo//9YuiO1Y/7DA0GhMSABjPLWAHgoZaBqkk2FQNVMKhRUeVRoqFokfjG3sQBwgHbAYyABaQePmRtAoYOtDXzQPKybsYNdjTn6Jzsk51GWn7klN3dTXt7mgoKt+fnbLF3f1wEvObPPi9w9uYWb8oo2F5SUnVZ85UOoH/YoIiT8XBtpjZ08atpabuKrnYdfMP5Xt92j72IdaEPrK7QVhw6yY+4m7agtsw8flfcFS+PyBuBKfv5s18BR7fS2trrdPlec//38zRtMpuH/Fsr27bKQ5/Kdpjg37F3bwtqpU22eLw1zz4W1a25tFpg8l4eaeDGTVeWbSVNxY8+5vudH4mHnVczD8/el+Xl/O9pFIoFf378iAg8mUyTzrBn4y5aV1dQ2eU3OzLKpU7jx+o21bNm6dbbO8oyYrDt1ah2SCeVB2Rt8UuSbeXu9/t6NiEgvkouAvTpSVcL/Su3r/gA+CsQ+o2D/yfvdhXV7283+a7sGgOIzLX1g8H+loV/KRkFr0W8VtewwqsQwWUZutYVyyGI8P02plD4H+JnejpSPo+7SOg6CnRIxULSiD2hsBiMMZjRYuEyGADbzwGEUS0936cQFNGKCwEjuABDa8xsUbYkATXvSEAZTBhZdaYQA7UWDwxbpdEGXoWJOfqGhIXpp/zJ1x66WhT6ovGF4r40lJT7hBQtTRLI4zWZq7LAx9oTPkJMqascmFbgd1vWQ044ZHeORPMsk0bJvirtjc56Fhobopf3L1B27ur3pcz9/w/BeG6tpq3C+YGGaXLI4bYGolXurtmt5TfgMOamidmxSATtWM3nIWb5sRsd47BE/ywR107bKeH719ozHAAdjsSVKtBixJEDw5EMREW5LGHZklCt3FM4BAAAA') format('woff2'),
      url('../media/iconfont.woff?t=1581833245354') format('woff'),
      url('../media/iconfont.ttf?t=1581833245354') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
      url('../media/iconfont.svg?t=1581833245354#iconfont') format('svg'); /* iOS 4.1- */
    }
    
    .iconfont {
      font-family: "iconfont" !important;
      font-size: 16px;
      font-style: normal;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    
    .icon-icon-test:before {
      content: "\e633";
    }
    
    .icon-icon-test1:before {
      content: "\e63a";
    }
    
    .icon-icon-test2:before {
      content: "\e640";
    }
    
    .icon-icon-test3:before {
      content: "\e644";
    }

    index.less

    #box {
      width: 200px;
      height: 200px;
      background-image: url('../imgs/angular.jpg');
      background-repeat: no-repeat;
      background-size: 100% 100%;
    }

    index.js

    import '../css/index.less';
    import '../css/a.css';
    import '../css/b.css';
    import '../css/iconfont.css';
    
    function add(x, y) {
      return x + y;
    }
    
    const promise = new Promise(((resolve) => {
      setTimeout(() => {
        console.log('定时结束~');
        resolve();
      }, 1000);
    })); // 下一行eslint所有规则都失效(下一行不进行eslint检查)
    // eslint-disable-next-line
    
    console.log(add(1, 2));
    console.log('promise:', promise);

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>webpack</title>
    </head>
    <body>
        <!--这里是注释啊~-->
        <div id="box1"></div>
        <div id="box2"></div>
    
        <span class="iconfont icon-icon-test"></span>
        <span class="iconfont icon-icon-test2"></span>
        <span class="iconfont icon-icon-test3"></span>
        <span class="iconfont icon-icon-test1"></span>
        <div id="box"></div>
        <img src="./imgs/vue.jpg" alt="vue">
        <img src="./imgs/react.png" alt="react">
    </body>
    </html>

    webpack.config.js

    const {resolve} = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    //提取 js 中的 css 成单独文件
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    //压缩css
    const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
    
    // 定义nodejs环境变量:决定使用browserslist的哪个环境
    process.env.NODE_ENV = 'production';
    
    //复用 loader
    const commonCssLoader = [
        // 这个 loader 取代 style-loader。作用:提取js中的css成单独文件
        //MiniCssExtractPlugin.loader 加载不了 less文件中的图片,记录一下坑,使用"style-loader"可以加载。。。
        MiniCssExtractPlugin.loader,
        //如果只使用loader的默认配置,就直接写字符串,会默认加载。
        'css-loader',
    
        // css兼容性处理
        //如果要修改配置,就使用对象的形式
        {
            // 还需要在package.json中定义browserslist
            loader: "postcss-loader",
            options: {
                ident: "postcss",
                plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                ]
    
            }
        }
    ]
    module.exports = {
        entry: './src/js/index.js',
        output: {
            filename: "js/built.js",
            path: resolve(__dirname, "build")
        },
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: [...commonCssLoader]
                },
                {
                    test: /\.less$/,
                    use: [...commonCssLoader, 'less-loader']
                },
                /*
                    正常来讲,一个文件只能被一个loader处理。
                    当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
                      先执行eslint 再执行babel
                  */
                // js语法检查(eslint)
                {
                    // 在package.json中eslintConfig --> airbnb
                    test: /\.js$/,
                    exclude: /node_modules/,
                    //当一个文件要被多个loader处理,添加 enforce: "pre",会被优先执行
                    enforce: "pre",
                    loader: "eslint-loader",
                    options: {
                        //自动修复eslint的错误
                        fix: true,
                    }
                },
                //js兼容性处理
                {
                    test: /\.js$/,
                    exclude: /node_modules/,
                    loader: "babel-loader",
                    options: {
                        presets: [
                            [
                                //@babel/preset-env: 基本js兼容性处理
                                '@babel/preset-env',
                                {
                                    //按需处理
                                    //按需加载
                                    useBuiltIns: 'usage',
                                    //指定 core-js 版本
                                    corejs: {
                                        version: 3
                                    },
                                    //指定兼容性做到哪个版本
                                    targets: {
                                        chrome: '60',
                                        firefox: '60',
                                        ie: '9',
                                        safari: '10',
                                        edge: '17'
                                    }
                                }
                            ]
                        ]
                    }
                },
                // 打包图片资源
                {
                    test: /\.(jpg|png|gif)$/,
                    loader: 'url-loader',
                    options: {
                        limit: 8 * 1024,
                        name: '[hash:10].[ext]',
                        outputPath: 'imgs',
                        esModule: false
                    }
                },
                // 打包html资源
                {
                    test: /\.html$/,
                    loader: 'html-loader'
                },
                // 打包其它资源
                {
                    exclude: /\.(js|css|less|html|png|jpg|gif)$/,
                    loader: "file-loader",
                    options: {
                        outputPath: "media"
                    }
                }
            ]
        },
        plugins: [
            //提取 js 中的 css 成单独文件
            new MiniCssExtractPlugin({
                //对输出文件名进行重命名
                filename: 'css/built.css'
            }),
            //压缩 css
            new OptimizeCssAssetsWebpackPlugin(),
            new HtmlWebpackPlugin({
                template: "./src/index.html",
                //压缩 html 代码
                minify: {
                    // 移除空格
                    collapseWhitespace: true,
                    // 移除注释
                    removeComments: true
                }
            })
        ],
        mode: 'production'
    }

    3.打包

    $ webpack

     end~

  • 相关阅读:
    失落的情
    我有个想法------彩南书屋
    西藏旅游闲记(上)
    夜归
    宝石山再记
    学车的日子(一)
    BootStrapValidator表单验证插件的学习和使用
    shard_row_id_bits & pre_split_regions
    某某大肠_tikv_修改配置参数
    第十二周总结
  • 原文地址:https://www.cnblogs.com/sener/p/16669581.html
Copyright © 2020-2023  润新知