Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

讲一下 webpack 原理, loader 和 plugin,你知道哪些模块化标准,说下 cjs 和 esmodule 的区别 #216

Open
lgwebdream opened this issue Jul 6, 2020 · 2 comments
Labels
头条 company 工程化 teach_tag 挖财 company 滴滴 company 阿里 company

Comments

@lgwebdream
Copy link
Owner

No description provided.

@lgwebdream lgwebdream added 头条 company 工程化 teach_tag 挖财 company 滴滴 company 阿里 company labels Jul 6, 2020
@lgwebdream
Copy link
Owner Author

扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。

@talang1991
Copy link

talang1991 commented Jun 4, 2024

webpack 原理从启动构建到输出结果一系列过程:

(1)初始化参数:解析webpack配置参数,合并shell传入和webpack.config.js文件配置的参数,形成最后的配置结果。

(2)开始编译:上一步得到的参数初始化compiler对象,注册所有配置的插件,插件监听webpack构建生命周期的事件节点,做出相应的反应,执行对象的 run 方法开始执行编译。

(3)确定入口:从配置的entry入口,开始解析文件构建AST语法树,找出依赖,递归下去。

(4)编译模块:递归中根据文件类型和loader配置,调用所有配置的loader对文件进行转换,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。

(5)完成模块编译并输出:递归完事后,得到每个文件结果,包含每个模块以及他们之间的依赖关系,根据entry配置生成代码块chunk。

(6)输出完成:输出所有的chunk到文件系统。

Loader:用于对模块源码的转换,loader描述了webpack如何处理非javascript模块,并且在build中引入这些依赖。loader可以将文件从不同的语言(如TypeScript)转换为JavaScript。
Plugin:目的在于解决loader无法实现的其他事,从打包优化和压缩,到重新定义环境变量,功能强大到可以用来处理各种各样的任务。

简而言之,loader可以理解成webpack的横向广度,有了loader,webpack才可以打包处理各种的扩展语言。而plugin可以理解为webpack的纵向深度,在生命周期内注入不同的插件来扩展更多的能力。

几种常用的模块化规范:
CommonJS规范
AMD规范
UMD规范
ESModule

1.CommonJS建立模块依赖关系是在运行时,ESModule是在编译时;
2.在模块导入方面,CommonJS导入的是值拷贝,ESModule导入的是只读的变量映射;
3.ESModule通过其静态特性可以进行编译过程中的优化,并且具备处理循环依赖的能力。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
头条 company 工程化 teach_tag 挖财 company 滴滴 company 阿里 company
Projects
None yet
Development

No branches or pull requests

2 participants