0

0

0

修罗

站点介绍

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

webpack 生产环境的基本配置

修罗 2020-08-03 1740 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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