构建Webpack知识体系| 青训营笔记

53 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第10天。

构建Webpack知识体系:

一:什么是Webpack:

1.      前端是由多个资源构成的。

2.      Webpack本质上是一种前端资源编译、打包工具:多份资源文件打包成一个Bundle ,支持Babel、Eslint、 TS、CoffeScript. Less、Sass。支持模块化处理css、图片等资源文件、支持HMR+开发服务器、支持持续监听、持续构建、支持代码分离、支持Tree-shaking、支持Sourcemap。

二:使用Webpack

1.      安装:

1.png

2.      编辑配置文件

2.png

3.      执行编译命令

3.png

4.      核心流程:

a)       入口处理:从’entry'文件开始,启动编译流程

b)       依赖解析:从‘entry’ 文件开始,根据”require' or "import'等语句找到依赖资源

c)        资源解析:根据’module'配置,调用资源转移器,将png、css等非标准JS资源转译为JS内容

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

5.      模块化+一致性:

a)       多个文件资源合并成一个,减少http 请求数

b)       支持模块化开发

c)        支持高级JS特性

d)       支持Typescript、CoffeeScript方言

e)       统一图片、CSS、字体等其它资源的处理模型

6.      配置:

a)       口流程类:作用于流程中某个or若干个环节,直接影响打包效果的配置项

b)       D工具类:主流程之外,提供更多工程化能力的配置项

7.      流程类配置:

a)       输入:‘entry’ ‘context’

b)       模块解析:‘resolve’、‘externals’

c)        模块转译:‘module’

d)       后处理:‘optimization’‘mode’‘target’

8.      声明入口‘entry’

module. exports = {

    entr y: ”./src/ index"

};

9.      声明产物出口‘output’

const path = require("path");



module. exports = {

    entry:” ./src/ index",

        output: {

            filename: " [name].js" ,

            path: path. join(__ dirname ,“./dist"),

    }

};

10.   处理CSS:

a)       安装loader:

npm add -D css-loader style-loader

b)       添加‘module’处理css文件:

const path = require( "path" );



module. exports = {

    entry : ”./src/ index",

    output: {

        filename: " [name].js",

        path: path. join(__ dirname, “./dist"),

    },

    module: {

        // Css 处理器

        rules: [{

            test:/\.css/i,

            use:[

                "style-loader" ,

                “css-loader "

            ],

        }],

    },

};

11.   接入Bable:

a)       安装依赖:

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

b)       声明产物出口‘output:

4.png

c)        执行‘npx webpack’

12.   生成HTML

a)       安装依赖:

5.png

b)       声明产物出口‘output’:

6.png

c)        执行:‘npx Webpack’:

13.   工具线:

a)       HMR:Hot Module Replacement一模块热替换

b)       Tree-Shaking:

模块导出了,但未被其它模块使用

开启tree- shaking:

‘imode: ”production”'

“optimization.’usedExports: true'”

三:进阶篇:理解Loader:

1.      为了处理非标准JS资源,设计出资源翻译模块—Loader。用于将资源翻译为标准JS。

2.      链式调用:

a)       less-loader: 实现less=> css的转换

b)       css-loader:将CSS包装成类似module.exports= "${css}" 的内容,包装后的内容符合JavaScript 语法

c)        style-loader:将css模块包进require语句,并在运行时调用injectStyle 等函数将内容注入到页面的style标签

3.      特点:链式执行、支持异步执行、分normal、pitch 两种模式

四:进阶篇:理解插件:

1.      钩子的核心信息:

a)       时机:编译过程的特定节点,Webpack 会以钩子形式通知插件此刻正在发生什么事情;

b)       上下文:通过tapable提供的回调机制,以参数方式传递上下文信息;

c)        交互:在上下文参数对象中附带了很多存在side effect的交互接口,插件可以通过这些接口改变