webpack4配置基础

前言

为什么要使用构建工具?

1.转换ES6语法(很多老版本的浏览器不支持新语法) 2.转换JSX  3.CSS前缀补全/预处理器  4.压缩混淆(将代码逻辑尽可能地隐藏起来)  5.图片压缩  6. ....

为什么选择webpack?

  1. 社区生态丰富
  2. 配置灵活、插件化扩展
  3. 官方更新迭代速度快

基础概念

默认的配置文件是weback.config.js,在package.json中配置脚本可以通过webpack --config来指定构建使用的配置文件。

初始化

创建并进入新的目录,执行如下命令,初始化package.json文件,这是一个模块的描述文件,-y的意思是所有配置都是yes

npm init -y

安装webpack

npm install webpack webpack-cli --save-dev

核心概念

先看一下一份最简单的webpack配置是什么样的

const path = require('path');

module.exports = {
   entry: './src/index.js',  // 打包的入口文件
   output: {    // 打包后的输出
      filename: "bundle.js",
      path: path.join(__dirname, "/dist")
   },
   mode: 'development', // 所处环境
   module: {
      rules: [
         {
            test: /\.js$/,
            use: "babel-loader"
         },
         ......
      ]
   },
   plugins: [
      new HtmlWebpackPlugin(),
   ]
};

entry

打包的入口文件 

单入口:

entry: "./src/index.js"

多入口(适用于多页面场景):

entry: {
    app: "./src/app.js",
    adminApp: "./src/adminApp.js",
}

output

打包之后的输出

单输出:

output: {
    filename: "bundle.js",
    path: __dirname + "/dist" 
}

多输出:

output: {
    filename: "[name].js", // 占位符[name]代表entry中的key
    path: __dirname + "/dist"
}

Loaders

webpack只支持JS和JSON两种文件类型,要想支持其他文件类型且转化成有效的模块,需要通过Loaders。Loaders本身是一个函数,接收源文件做参数,返回转换的结果。

常见的Loaders

babel-loader   转换ES6/ES7等语法
css-loader     支持.css文件的加载和解析
less-loader    将less文件转换成css
ts-loader      将TS转换成js
file-loader    将图片、字体等的打包
raw-loader     将文件以字符串的形式导入
thread-loader  多线程打包JS和CSS

Plugins

插件用于打包文件的优化,资源管理和环境变量注入,作用于整个构建过程。也可以理解为Loaders无法完成的事情都可以用Plugins完成。

常见的Plugins:

CommonsChunkPlugin        常用于多页面打包情况下,将多个页面公用的js代码块提取成公共js
CleanWebpackPlugin        清理构建目录
ExtractTextWebpackPlugin  将CSS从bundle文件里提取成一个独立的CSS文件
CopyWebpackPlugin         将文件或文件夹拷贝到够贱的输出目录
HtmlWebpackPlugin         创建html文件去承载输出的bundle。这个非常有用,不需要我们手动去创建html文件
UglifyjsWebpackPlugin     压缩JS
ZipWebpackPlugin          将打包的资源生成一个zip包

mode

用来指定当前的构建环境,值有 production 、development 、none,默认是production。通过mode可以使用webpack内置的函数和功能:

developement

开启 NamedChunksPlugin 和 NamedModulesPlugin 在代码热更新阶段,打印哪个模块发生了更新

production

开启 FlagDependencyUsagePlugin , FlagIncludedChunksPlugin , ModuleConcatenationPlugin , NoEmitOnErrorsPlugin,OccurrenceOrderPlugin , SideEffectsFlagPlugin 和 TerserPlugin

none

不开启任何优化

webpack基础功能

解析ES6

使用babel-loader, babel的配置文件是.babelrc, 增加ES6的babel preset配置

1.安装包

npm install @babel/core @babel/preset-env babel-loader -D

2.创建.babelrc文件,并添加配置

{
  "presets": [
    "@babel/preset-react",
    "@babel/preset-env"
  ]
}

3.webpack.config.js配置

module: {
      rules: [
         {
            test: /\.js$/,
            use: "babel-loader", // 用来解析ES6
         },
      ]
},

解析JSX

增加babel preset配置:

"@babel/preset-react"

要在React中使用箭头函数,需要安装插件

npm i @babel/plugin-proposal-class-properties
// .babelrc
"plugins": [
    "@babel/plugin-proposal-class-properties"
]

解析CSS/CSS预处理/前缀补全

less-loader   将less转化成css
css-loader    让webpack解析css文件,并转换成commonjs对象,插入到JS里(因为webpack本身只支持js和json)
style-loader  将样式通过