重学webpack5——生产环境配置

2023-10-26

目录

前言

一、CSS文件

(1)提取css 成单独文件

(2) CSS兼容性处理

(3)压缩CSS

二、Js文件

        (1)JS语法检查eslint

(2)JS兼容性处理

(3)JS压缩

三、HTML文件

四、生产环境总结


前言

生产环境是能让代码优化上线运行的环境,有些操作在开发环境来做比较多余,我们在生产环境来配置。本文会从文件内容的角度出发,介绍CSS、JS、HTML的 文件提取兼容性处理压缩

一、CSS文件

(1)提取css 成单独文件

下插件包

npm i mini-css-extract-plugin

webpack配置

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",
};

(2) CSS兼容性处理

下两个包

npm i  postcss-loader postcss-preset-env

postcss-loader :根据node环境变量生成对应环境的兼容性代码;

  • 设置环境变量: process.env.NODE_ENV = 'development';
  • 如果不手动设置node环境变量,默认为"production"。

postcss-preset-env:帮助postcss-loader找到package.json中browserslist的配置


  "browserslist": {
    /*开发环境,这里对应的是node的环境变量(非webpack.config.js配置的mode):
    process.env.NODE_ENV = development*/
    "development": [
      "last 1 chrome version", //chrome最新的一个版本
      "last 1 firefox version",
      "last 1 safari version"
    ],
    "production": [
      ">0.2%", // 兼容市面上(使用人数?待查)最靠前的99.8%的浏览器
      "not dead", // 兼容非死亡的浏览器
      "not op_mini all" // 兼容非open mini浏览器
    ]
  }

webpack配置

1)先要在package.json中配置字段browserslist :

{
  "name": "webpack-study",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "browserslist": {
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ],
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ]
  }
}


2)webpack配置:

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

// 配置node的环境变量
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',
            options: {
              postcssOptions: {
                ident: 'post-css',
                plugins: [
                  'postcss-preset-env'
                ]
              }
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new HTMLWebpackPlugin({
      template: './src/index.html'
    }),
    new MiniCssExtractPlugin({
      filename: 'css/built.css'
    })
  ],
  mode: 'development'
}

(3)压缩CSS

下载插件

//新版本会报错,安装@3,这样其他配置也要改,可以用css-minimizer-webpack-plugin
npm install optimize-css-assets-webpack-plugin@3
npm i css-minimizer-webpack-plugin

 webpack配置

const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin");

module.exports = {
  plugins: [
    // 压缩css
    new OptimizeCssAssetsWebpackPlugin(),
  ],
};

建议使用css-minimizer-webpack-plugin 

const { resolve } = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const MiniCSSExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin');

// 配置node的环境变量 - css兼容性处理时使用
// 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',
            options: {
              postcssOptions: {
                ident: 'postcss',
                plugins: [
                  'postcss-preset-env'
                ]
              }
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new HTMLWebpackPlugin({
      template: './src/index.html'
    }),
    new MiniCSSExtractPlugin({
      filename: 'css/built.css'
    }),
    // 压缩css
    new CssMinimizerWebpackPlugin()
  ],
  mode: 'development'
}

二、Js文件

(1)JS语法检查eslint

下四个包

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

 配置

1)先要在package.json中配置字段eslintConfig:

{
  "name": "webpack-study",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "eslintConfig": {
    "extends": "airbnb-base",
    "env": {
      "browser": true
    }
  }
}

 2)webpack配置:

const { resolve } = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build'),
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        options: {
          // 自动修复eslint的错误
          fix: true
        }
      }
    ],
  },
  plugins: [
    new HTMLWebpackPlugin({
      template: './src/index.html',
    }),
  ],
  mode: 'development',
};

(2)JS兼容性处理

1)什么是JS兼容性处理?
其实就是把ES6及以上(后边简写为ES6+)新增的语法、API处理成ES5及以下的版本,解决某些浏览器(ie)上的兼容性报错问题。

2)Babel简介:
Babel 是一个工具链,主要用于在当前和旧的浏览器或环境中,将ES6+代码转换为JavaScript向后兼容版本的代码。

3)polyfill是啥?
不知道大家之前有没有过这种疑问:只知道babel是处理ES6+兼容的,polyfill分别是干嘛的?
其实,ES6+语法和新增的API需要分开进行处理,polyfill是针对新增API的~(比如:箭头函数是新增语法,Promise是新增的API)

下五个包

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

配置 (非按需加载)

webpack.config.js:

// 以下是单个loader配置
{
  test: /\.js$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  presets: [
    [
      '@babel/preset-env'
    ]
  ]
}

在上面的例子最顶部加import '@babel/polyfill’

import '@babel/polyfill';

const add = (x, y) => {
  return x + y;
};
console.log(add(2, 5));

const promise = new Promise(resolve => {
  setTimeout(() => {
    console.log('定时器执行完了~');
    resolve();
  }, 1000);
});

console.log(promise);

配置(按需加载) 

下载
基础核心包: babel-loader和@babel/core ;

处理语法和API: @babel/preset-env+配置;。

  • 配置基于:core-js 。

注意:不需要在js中import @babel/polyfill

// 以下是单个loader配置
{
  test: /\.js$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    // 预设:指示babel做怎么样的兼容性处理
    presets: [
      [
        '@babel/preset-env',
        {
          /** https://babeljs.io/docs/en/babel-preset-env#usebuiltins
           * useBuiltIns:配置@babel/preset-env如何处理polyfills,取“usage”,“entry”,“false”之一,默认为“false”
           *  - 当使用usage或entry选项时,@babel/preset-env将添加对core-js模块的直接引用,类似import(或require)。这意味着core-js将相对于文件本身进行解析,并且按需引入。
           */
          useBuiltIns: 'usage', // 按需加载
          corejs: { version: 3 }, // 指定corejs的版本
          targets: { chrome: '60', firefox: '60', ie: '9', safari: '10', edge: '17' } // 指定兼容到浏览器哪个版本
        }
      ]
    ]
  }
}

(3)JS压缩

生产环境会自动压缩js代码,只需要将模式改成生产模式即可

// 生产环境下会自动压缩js代码
mode: 'production'

三、HTML文件

HTML文件不像CSS和JS,不需要做兼容性处理。

压缩HTML

使用的plugin:html-webpack-plugin + 配置

配置

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build')
  },
  plugins: [
    // html压缩只需配置html-webpack-plugin
    new HTMLWebpackPlugin({
      template: './src/index.html',
      minify: {
        removeComments: true, // 移除注释
        collapseWhitespace: true // 移除空格
        // 更多配置可以自行探索
      }
    })
  ],
  mode: 'production'
}

四、生产环境总结

从文件类型出发,一起来捋捋

  • 先是样式(css/less/sass):
    • css文件:
      • postcss-loader处理css兼容性(还需下载postcss-preset-env,在package.json中配置browserslint字段);
      • css-loader将css文件转换成commonjs模块加载到js中;
      • mini-css-extract-plugin将js中的css模块提取成单独的一个文件;
      • css-minimizer-webpack-plugin压缩css;
    • less文件:
      • 在css文件的基础上多了less-loader(需在压缩前执行,还需下载less);
    • sass文件:
      • 在css文件的基础上多了sass-loader(需在压缩前执行,还需下载node-sass);
  • 再是js文件:
    • eslint-loader做语法检查(还需下载eslinteslint-config-airbnb-baseeslint-plugin-import eslint,在package.json中配置eslintConfig字段)
    • babel-loader处理js兼容性:
      • babel-loader+@babel/core+@babel/preset-env:只能处理ES6+语法问题;
      • babel-loader+@babel/core+@babel/preset-env+ @babel/polyfill:以非按需加载的方式处理js全部兼容性问题;
      • babel-loader+@babel/core+@babel/preset-env+ 配置:以按需加载的方式处理js全部兼容性问题(推荐);
    • 将mode设置为production,自动压缩js代码;
  • 然后是html文件:
    • html-webpack-plugin创建一个空的html并自动引入所有webpack打包输出的资源;
      • 再对其进一步配置,做到压缩html代码。
  • 还有图片资源:
    • url-loader处理css中的图片资源(img标签除外)(还需下载file-loader);
    • 针对img标签:html-loader处理html文件的img图片,从而能被url-loader处理;
  • 最后其他资源:file-loader

webpack配置

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

process.env.NODE_ENV = 'production';

const commonCssLoader = [
  MiniCssExtractPlugin.loader,
  // 'style-loader', // 直接将css放到style标签里
  'css-loader',
  {
    loader: 'postcss-loader',
    options: {
      postcssOptions: {
        ident: 'post-css',
        plugins: [ 'postcss-preset-env' ] // 还需要在package.json中配置browserslist
      }
    }
  }
];

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-loader,再执行babel-loader
       */
      {
        // 需要在package.json中配置eslintConfig
        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',
                  ie: '9'
                }
              }
            ]
          ]
        }
      },
      {
        test: /\.(jpg|png|gif)$/,
        loader: 'url-loader',
        options: {
          limit: 8 * 1024,
          name: '[hash:10].[ext]',
          outputPath: 'images',
          esModule: false
        }
      },
      {
        test: /\.html$/,
        loader: 'html-loader',
        options: {
          esModule: false
        }
      },
      {
        exclude: /\.(js|html|css|less|jpg|png|gif)$/,
        loader: 'file-loader',
        options: {
          outputPath: 'assets'
        }
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/built.css'
    }),
    new CssMinimizerWebpackPlugin(),
    new HTMLWebpackPlugin({
      template: './src/index.html',
      minify: {
        removeComments: true,
        collapseWhitespace: true
      }
    })
  ],
  mode: 'production'
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重学webpack5——生产环境配置 的相关文章

随机推荐

  • 希望余生尽早开始

    我爱你在暖和的天气感冒 我爱你用一小时来点菜 我爱你皱着眉头看我 好像我是疯子一样 我爱跟你分别后 仍然萦绕不散的余香 我想在睡前和你聊天 我来这并不是因为我寂寞 也不是因为今天是除夕 是因为发现 如果你想要与某人共度余生 那你就会希望余生
  • Apache中的挂钩剖析(3)

    5 5 7 可选挂钩 与标准挂钩相比 可选挂钩基本上没有太大的差异 唯一的区别就在于可选挂钩不一定需要被实现 这看起来令人迷惑的 不过你很快就会明白了 考虑一下 如果某个挂钩Hook A是声明在一个可选模块中 那么正常情况下该模块没有被加载
  • 单片机程序跑飞原因

    参考 单片机程序又跑飞 作者 嵌入式ARM 网址 https mp weixin qq com s a22zVdSfCqWjSmlBxK2R1Q 目录 数组越界 溢出 中断服务程序缺失 看门狗复位 单片机中有看门狗 长时间不喂狗 程序就会复
  • 从零开始使用docker部署Go Web App

    docker的基本使用 如何在ubuntu 16 04上安装docker 以及docker的基本使用可以参考我的上一篇博客 服务计算之玩转 Docker dockerfile的编写 要在docker上部署应用一定绕不开编写dockerfil
  • 三种循环详解和练习

    循环讲解和练习 1 1 for循环语句基本格式 for 语句1 表达式 语句2 语句块 大多数问题我们都可以通过for的嵌套进行了解 for 语句1 表达式 语句2 for 语句1 表达式 语句2 语句块 for int i 0 i lt
  • Android常见的adb命令

    查看当前的device adb devices 如果有多个devices adb s 设备号 其他指令 查看顶部Activity windows环境下 adb shell dumpsys activity findstr mFocusedA
  • linux安装docker 教程

    1 卸载之前安装的docker sudo 以管理员身份运行 sudo yum remove docker docker client docker client latest docker common docker latest dock
  • 学习机器学习选择python,还是spark,Scala?

    这种问法是初接触者的困惑 尤其是现在铺天盖地的python机器学习课程 会让人以为python就是工作中主流了 那spark是干什么呢 Scala这个名字好像也听过 以下摘自一段相对好理解的回答 spark是用在大数据场景中的 python
  • Premiere Pro CC2018安装资料及安装教程

    简介 Adobe Premiere是一款常用的视频编辑软件 由Adobe公司推出 现在常用的版本有CS4 CS5 CS6 CC 2014 CC 2015 CC 2017 CC 2018以及CC 2019版本 Adobe Premiere是一
  • 论文写作 12: 算法伪代码 (含实例)

    算法伪代码是论文的核心之一 需要说明输入 输出 方法 函数 名可写可不写 如果被别的方法调用就必须写 需要写出主要步骤的注释 长度控制在 15 30 行 可使用数学式子或对已有数学式子的引用 不重要的步骤可以省略 一般需要进行时间 空间复杂
  • 详解Nginx proxy_pass 使用

    前言 日常不管是研发还是运维 都多少会使用Nginx服务 很多情况Nginx用于反向代理 那就离不开使用proxy pass 有些同学会对 proxy pass 转发代理时 后面url加 后面url没有 后面url添加其它路由等场景 不能很
  • en结尾的单词_知识丨英语单词中最常见的328个前缀后缀,高效背单词必备!

    北京高考资讯 争取给你更好的 更新鲜的高考资讯 记忆单词最好的两个办法就是 结合语境和运用构词法 构词法包括派生 即我们平时说的前后缀 合成和转化 而派生在构词法中是最重要的 今天老师带大家来看一下高中阶段涉及到的328个前后缀都有哪些 记
  • 这19款最好用的免费安全工具,使用不当或许面临牢狱之灾。

    前言 大家好 我是周杰伦 工具本身没有好坏 但如果能充分利用好的工具 往往能达到意想不到的效果 安全行业尤其如此 这期推荐的是一些免费而且很优秀的安全软件工具 无论是渗透测试 开源情报 还是漏洞评估 都能让安全人的日常工作更轻松 将近 20
  • 软件测试面试题—选择题2

    选择题 1 验收测试的测试用例主要根据 的结果来设计 A 需求分析 B 源程序 C 概要设计 D 详细设计 答案 A 2 以下不属于应用系统中的缺陷类型的是 A 不恰当的需求解释 B 用户指定的错误需求 C 设计人员的习惯不好 D 不正确的
  • 最简单的分类算法之一:KNN(原理解析+代码实现)

    KNN K Nearest Neighbor 即K最邻近算法 是数据挖掘分类技术中最简单的方法之一 简单来说 它是根据 最邻近 这一特征来对样本进行分类 目录 1 大致了解KNN 2 原理分析 2 1一些数学知识 2 2算法思想 3 代码实
  • linux 在服务器上挂硬盘,linux如何挂载硬盘linux服务器上挂载磁盘(图文详解)...

    博主最近在研究服务器运维 由于Linux服务器相对比较困难 所以博主对她情有独钟 而window服务器几乎跟我们平常使用的电脑一样 相对简单感觉索然无味 下面正式进入主题教大家linux如何挂载硬盘 首先解答一个新手朋友都会问的问题 而且这
  • Inno setup Run Win7管理员运行属性

    runascurrentuser If this flag is specified the spawned process will inherit Setup Uninstall s user credentials typically
  • 《Angular2入门系列实践》——实现页面动画效果

    前言 在前端的路上越走越远 也希望利用angular2使自己的页面效果更加美观 所以从官网上学习了一下 内容 1 写animation ts import animate AnimationEntryMetadata state style
  • leetcode暴力屎山代码(一)——leetcode4

    题目 给定两个大小分别为 m 和 n 的正序 从小到大 数组 nums1 和 nums2 请你找出并返回这两个正序数组的 中位数 思路 由于两数组是有序排列的 所以可以通过计算两个数组中位数的索引 mid 并通过双指针从左到右遍历找到第mi
  • 重学webpack5——生产环境配置

    目录 前言 一 CSS文件 1 提取css 成单独文件 2 CSS兼容性处理 3 压缩CSS 二 Js文件 1 JS语法检查eslint 2 JS兼容性处理 3 JS压缩 三 HTML文件 四 生产环境总结 前言 生产环境是能让代码优化上线