0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

webpack 生产环境的基本配置

修罗 2020-08-03 1509 0条评论 前端资源构建 webpack

首页 / 正文

webpack之二

第 4 章:webpack 生产环境的基本配置

4.1 提取 css 成单独文件

a.css和b.css是对两个box设置的简单样式

1596634475445.png

下载插件

npm install --save-dev mini-css-extract-plugin 

配置:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          // 创建style标签,将样式放入
          // 'style-loader', 
          // 这个loader取代style-loader。作用:提取js中的css成单独文件
          MiniCssExtractPlugin.loader,
          // 将css文件整合到js文件中
          'css-loader'
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    }),
    new MiniCssExtractPlugin({
      // 对输出的css文件进行重命名
      filename: 'css/built.css'
    })
  ],
  mode: 'development'
};

提取js中的css成单独文件,两个css合并成main.css

1596634206337.png

对输出的css文件进行重命名

new MiniCssExtractPlugin({
    filename: 'css/built.css'
})

1596634638584.png

4.2 css 兼容性处理

下载 loader

npm install --save-dev postcss-loader postcss-preset-env

css兼容性处理:

postcss(css兼容性处理要用的库) -> postcss-loader (在webpack里使用就要这个)

postcss-preset-env:识别浏览器环境,帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

// 设置nodejs环境变量
// process.env.NODE_ENV = 'development';

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          /* 使用loader的默认配置 
             'postcss-loader'等同{ loader: 'postcss-loader' }*/
          // 'postcss-loader',
          {
            loader: 'postcss-loader',
            // 修改loader的配置
            options: {
              // 固定写法
              ident: 'postcss',
              plugins: () => [
                // postcss的插件
                require('postcss-preset-env')()
              ]
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    }),
    new MiniCssExtractPlugin({
      filename: 'css/built.css'
    })
  ],
  mode: 'development'
};

这里默认使用生产环境,设置nodejs环境变量

process.env.NODE_ENV = 'development';

package.json

// github搜browserslist获取更多配置
"browserslist": {
    // 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
    "development": [
        "last 1 chrome version",
        "last 1 firefox version",
        "last 1 safari version"
    ],
    // 生产环境:默认是看生产环境
    "production": [
        // 大于百分之99.8的浏览器
        ">0.2%",
        "not dead",
        "not op_mini all"
    ]
}

1596637587376.png

4.3 压缩 css

安装插件

npm install --save-dev optimize-css-assets-webpack-plugin

配置

// 导入库
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

// plugins添加
new OptimizeCssAssetsWebpackPlugin()

压缩后

1596638544175.png

4.4 js 语法检查

检查语法错误,统一代码风格

npm install --save-dev eslint-loader eslint eslint-config-airbnb-base eslint-plugin-import

配置文件

module: {
    rules: [
        /*
        语法检查: eslint-loader  eslint
          注意:只检查自己写的源代码,第三方的库是不用检查的 
          airbnb(语法风格,没有react一些插件) --> eslint-config-airbnb-base  eslint-plugin-import eslint
      */
        {
            test: /\.js$/,
            exclude: /node_modules/,
            // 一个loader直接写,不用写一个数组
            loader: 'eslint-loader',
            options: {
                // 自动修复eslint的错误
                fix: true
            }
        }
    ]
}

设置检查规则:package.json,或者加到.eslintrc文件中

"eslintConfig": {
    "extends": "airbnb-base"
}

.eslintrc.js

1596641550482.png

效果

1596641698563.png

4.5 js 兼容性处理

npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/polyfill core-js

js兼容性处理:babel-loader @babel/core

1、基本js兼容性处理 --> @babel/preset-env

  问题:只能转换基本语法,如promise高级语法不能转换
{
  test: /\.js$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    // 预设:指示 babel 做怎么样的兼容性处理
    presets: ['@babel/preset-env']
  }
}

2、全部js兼容性处理 --> @babel/polyfill

  问题:我只要解决部分兼容性问题,但是将所有兼容性代码全部引入,体积太大了
// 需要兼容的地方
import '@babel/polyfill'

3、需要做兼容性处理的就做:按需加载 --> core-js

{
  test: /\.js$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    // 预设:指示 babel 做怎么样的兼容性处理
    presets: [
      [
        '@babel/preset-env',
        {
          // 声明按需加载
          useBuiltIns: 'usage',
          // 指定 core-js 版本
          corejs: {
            version: 3
          },
          // 指定兼容性做到哪个版本浏览器
          targets: {
            chrome: '60',
            firefox: '60',
            ie: '9',
            safari: '10',
            edge: '17'
          }
        }
      ]
    ]
  }
}

4.6 js、html 压缩

js:生产环境下自动压缩

mode: 'production'

html

const HtmlWebpackPlugin = require('html-webpack-plugin');

plugins: [
    new HtmlWebpackPlugin({
        template: './src/index.html',
        // 压缩 html 代码
        minify: {
            // 移除空格
            collapseWhitespace: true,
            // 移除注释
            removeComments: true
        }
    })
]

4.8 总结:生产环境配置

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 定义nodejs环境变量:决定使用browserslist的哪个环境
process.env.NODE_ENV = 'production';

// 复用loader
const commonCssLoader = [
  MiniCssExtractPlugin.loader,
  'css-loader',
  {
    // 还需要在package.json中定义browserslist
    loader: 'postcss-loader',
    options: {
      ident: 'postcss',
      plugins: () => [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
      */
      {
        // 在package.json中eslintConfig --> airbnb
        test: /\.js$/,
        exclude: /node_modules/,
        // 优先执行
        enforce: 'pre',
        loader: 'eslint-loader',
        options: {
          fix: true
        }
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: [
            [
              '@babel/preset-env',
              {
                useBuiltIns: 'usage',
                corejs: {version: 3},
                targets: {
                  chrome: '60',
                  firefox: '50'
                }
              }
            ]
          ]
        }
      },
      {
        test: /\.(jpg|png|gif)/,
        loader: 'url-loader',
        options: {
          limit: 8 * 1024,
          name: '[hash:10].[ext]',
          outputPath: 'imgs',
          esModule: false
        }
      },
      {
        test: /\.html$/,
        loader: 'html-loader'
      },
      {
        exclude: /\.(js|css|less|html|jpg|png|gif)/,
        loader: 'file-loader',
        options: {
          outputPath: 'media'
        }
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/built.css'
    }),
    new OptimizeCssAssetsWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: './src/index.html',
      minify: {
        collapseWhitespace: true,
        removeComments: true
      }
    })
  ],
  mode: 'production'
};

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis