Webpack入门笔记 | 青训营

72 阅读3分钟

什么是Webpack

Webpack是一个前端资源编译、打包工具。 经过Webpack打包后,原始的JS语句会变成webpack_require语句。

Webpack的使用方法

安装

npm install webpack -g

写配置文件

“Webpack的使用,基本都围绕“配置”展开。” image.png 如图是webpack的一个配置文件,其中,

entry(入口起点):指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。默认值是./src/index.js,可以在module.exports更改入口。

module.exports = {
  entry: './path/to/my/entry/file.js',
};

output(输出):告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。默认值是 ./dist/main.js

loader(加载器):webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用,以及被添加到依赖图中。

loader有两个属性:test:识别出哪些文件会被转换; use:定义出在进行转换时,应该使用哪个 loader。 loader的配置写在一个单独的 module 对象中,他定义了 rules 属性,里面包含两个必须属性:test 和 use

  module: {
    rules: [{ test: /.txt$/, use: 'raw-loader' }],
  },

plugin(插件):插件相比于loader,可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用于访问内置插件

module.exports = {
  module: {
    rules: [{ test: /.txt$/, use: 'raw-loader' }],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};

mode(模式):可以设置 developmentproduction 或 none 作为mode的参数来启用 webpack 内置在相应环境下的优化,默认值 production

执行编译命令

npx webpack

了解Webpack的核心流程

入口处理

entry文件开始,启动编译流程

依赖解析

entry文件开始,根据require or import等语句找到依赖资源

资源解析

根据module配置,调用资源转移器,将pngcss等非标准JS资源转译为JS内容

资源合并打包

将转移后的资源内容合并打包为可直接在浏览器运行的JS文件

Webpack的具体使用

我们在配置文件中编写的配置可分为流程类配置工具类配置

流程类配置

image.png 在配置文件中entryoutput是必须写的。

处理CSS

假如我们想要处理非JS文件,需要使用插件loader

loaders

安装loader
npm install -D css-loader style-loader
添加module处理相应文件
module:{
rules:[{
    //test:过滤条件
    test:/\.css/i,
    //use:数组或对象,用什么样的loader处理文件
    use:[
    "style-loader",
    "css-loader"
    ],
}],

思考:Loader有什么作用?为什么这里需要用到css-loader、style-loader

思考:与旧时代——在HTML文件中维护css相比,这种方式会有什么优劣处?

思考:有没有接触过Less、Sass、Stylus这一类CSS预编译框架?如何在webpack接入这些工具?

处理Javascipt

采取接入Babel的方式。

Babel

Babel是一种JS代码转译工具,可以把高版本的JS代码转为低版本的JS代码。

安装依赖
npm i -D @babel/core @babel/preset-env babel-loader
声明出口产物
执行npx webpack

思考:Babel 具体有什么功能?

思考:Babel与Webpack分别解决了什么问题?为何两者能协作到一起了?

处理HTML

安装插件

npm i -D html-webpack-plugin

声明出口产物output

执行npx webpack

思考:相比于手工维护HTML 内容,这种自动生成的方式有什么优缺点?

工具类配置

模块热替换HMR

不用刷新整个浏览器,保存代码就可以看到效果。

开启HMR

module.exports = {
    devServer:{
    hot:true
        }
    };

启动Webpack

npx webpack serve

image.png

Tree-Sharking

可以用来删除一些没有用到的代码。

开启Tree-Sharking

mode:"production"

optimization.usedExports:true

思考:除上面提到的内容,还有哪些配置可划分为“流程类”配置?

思考:工具类配置具体有什么作用?包括`devtool/cache/stat等