前言:
webpack 仅仅只能分析各种模块的依赖关系,形成资源列表。输出到指定文件
先谈谈基本内容。 webpack 重要的地方还是在 优化上面。下一篇谈谈 优化
左: 模块依赖
中:webpack
右:运行内容(静态资源)
使用webpack工具的目的:将一群 浏览器不识别的东西,转成浏览器能识别的东西。
我对webpack的理解
仅仅只能分析各种模块的依赖关系,形成资源列表。输出到指定文件
webpack 是一个工具。工具的出现都是为了简化我们操作的。
webpack
目的 就是将一群 浏览器不识别的东西,转成浏览器能识别的东西。
1、 提一下 es6+。 es 在发展 提供有快捷的 简便的语法命令。
每个浏览器兼容性不一样呀,都是不一样的内核。
webpack 提供了 babel 用来转成 浏览器都识别的 es5。
2、 开发者 引入的三方包 (cmd esM) 不确定。 浏览器只识别 esM。 那就转成 esM。
例如: ajax 能在node中执行,用的就是 commjs 规范。 还有很多很多比较老的三方包。
webpack 打包的非常非常重要的特点
3、 浏览器只能认识打包之后的内容。 每次改点内容都得 build一下。 那也太耗时了。
webpack 引入了 热更新。
4、 然后打包的内容大, 等等等 就引入了 plugin 插件系统。
webpack 强大的生态。 plugin 各种都有。 然后 就出现了webpack的各种优化。
多线程打包 gizp压缩 等等等。
webpack 是什么
一个打包(构建)的工具。
基于模块化的打包(构建)工具。
webpack 把开发中用到的所有的东西,都视为模块。例如: js、 png、jpg、sass、css
webpack 基于nodejs 因为要读取文件
通过一个入口文件(启动文件)。 把入口文件当做一个模块,然后开始分析他的依赖关系。然后压缩等。
例如: import require amd cmd esm 他们的导入语句。他们就是有依赖关系的。
webpack 是 基于nodejs 环境的。 构建过程 是需要在 node环境
因为分析依赖 需要读取文件。 fs 那些的运行环境都是 node。
webpack特点:
1、 为前端工程化而生
1、 生态强大
2、 基于nodejs (运行在 nodejs 环境)
3、 基于模块化, 支持 cmd amd esm
webpack的安装 通过npm安装 提供了两个核心包
webpack(构建): 核心包。 包含了 webpack 的构建过程汇总用到的所有api
webpack-cli: 提供一个简单的cli 命令。 他会去调用 webpack api , 来完成构建。
默认情况下: webpack 会以 ./src/index.js 作为入口文件分析依赖关系,打包到 ./dist/main.js文件中。
通过 --mode 设置 环境。
development 开发环境,打包的内容 体积大 能阅读
product 生产环境, 打包的内容 体积小 阅读困难
npm i -D 开发环境
开发依赖和生产环境依赖如何区分
运行的时候(浏览器运行 html js) 需要不需要 需要就是生产依赖,不需要就是 开发依赖。
例如 webpack 开发需要webpack 构建。 构建完 就不需要webpack了。 因此是 开发依赖。
例如 某些三方包 jq 构建好的内容 依然需要 ,就是生产依赖
浏览器识别esM, 不识别 commonjs , 因此咱们让不管什么 模块化规则,都转成 esm。
node 环境 默认支持 commonjs。 支持esm 需要配置
方式1 (方式常用 经常出现 esm cmd 方式混用) 三方库
package.json 中 配置 type: 'module'
方式2
文件后缀 .mjs
用就好了
混用 常遇到情况
juejin.cn/post/741712… 这里说了些导入导出总结
1、 再 esM 中 需要用 三方包 是 commonjs的
不用直接esm 中用 require(), esm 规范 不认识 require()。
用动态加载的时候 包一层。 使用动态导入模拟 require()
commonjs
// comm.js
module.exports = {
a: '1',
b: '2'
}
转文件
const loadCommonJs = async () => {
const commonModule = await import('**/comm.js')
return commonModule
}
const commonModule = loadCommonJs()
webpack 编译过程
1、拿配置文件
2、从入口开始, 分析依赖
3、打包输出
1、拿配置文件
webpack 会将 cli参数、 package.json 配置文件、默认配置进行融合。
处理过程是 依赖 yargs 第三方库完成的
融合都是 三方库的特点。
yargs 是一个命令行参数解析的 node 库
2、 分析依赖就用 cmd esm import requre 来分析
3、 输出
当然聊 webpack, 怎么能不聊 plugin 和 loader呢
loader 一个函数
定位: 转换代码
转换成 浏览器能认识的东西,都是loader 来完成的。
作用: 将某个源码字符串转换成另一个源码字符串返回。
使用方式:
module.exports = {
module: { //针对模块的配置,目前版本只有两个配置,rules、noParse
rules: [ //模块匹配规则,可以存在多个规则
{ //每个规则是一个对象
test: /.js$/, //匹配的模块正则
use: ["模块路径1", "模块路径2"]//loader模块的路径,该字符串会被放置到require中
}
]
}
}
在rules 中配置 想要转换的规则
test 匹配文件
use 使用什么内容去转换
例如: 高阶es 转 es5。 less sass 转 css 等等
plugin
plugin的本质是一个带有apply方法的对象
var plugin = {
apply: function(compiler){
}
}
或者
class MyPlugin{
apply(compiler){
}
}
plugin 工作过程:
初始化阶段。 通过 plugin中 apply 函数,创建 Compiler 对象。 compiler 对象 只有一个。 其他工作是在 compiler 中创建 compilation 执行的。 apply 方法会在 创建好 compiler 对象后调用。 将 compiler 传入
compiler 的 钩子函数 www.webpackjs.com/api/compile…