Angular的编译过程是怎样的?
通常我么使用ng build
命令来编译Angular项目,但是这个命令背后的逻辑是怎样的呢?
ng build
命令底层是用WebPack
还是ESBuild
?ng build
命令是如何处理TypeScript
文件的?ng build
命令是如何处理HTML
文件的?
ts/js编译
Webpack的配置文件在这里:packages/angular_devkit/build_angular/src/tools/webpack/configs/common.ts
这个文件里我们可以看到如下rule
配置:
1 | { |
可以看到这个正则表达式匹配的是:
.ts
、.tsx
.js
、.jsx
.cjs
、.mjs
这些文件都会被require.resolve('../../babel/webpack-loader')
这个loader处理。而这个loader的代码在这里:packages/angular_devkit/build_angular/src/tools/babel/webpack-loader.ts
这个文件里面又调用了babelLoader。所以可知,ng build
命令底层是用Babel
来处理TypeScript
文件的。
这里可以画一个流程图:ng build -> Webpack -> Babel -> TypeScript
scss/sass/less/css编译
Webpack通过各种loader来处理不同类型的文件,比如css-loader
、sass-loader
、less-loader
等。那么什么是loader呢?loader是一个转换器,负责把一种文件格式转换为另一种文件格式。
1 | output_format = loader(input_format) |
loader是可以链式调用的,上一个loader的输出可以作为下一个loader的输入,比如scss
文件可以先经过sass-loader
处理,然后再经过css-loader
处理,最后再经过style-loader
处理。
1 | output_format = style-loader(css-loader(sass-loader(input_format))) |
Angular默认采用scss
作为样式文件的扩展名,所以我们可以看到scss
文件是如何被处理的:Webpack中关于样式文件的配置在这里:packages/angular_devkit/build_angular/src/tools/webpack/configs/styles.ts
1 | { |