Angular 5中@angular指向node_modules路径的原理咨询
嘿,这个问题我当初刚接触Angular的时候也困惑过,其实核心是Node.js的模块解析机制+Angular CLI的默认构建配置在悄悄帮你干活,不用手动写路径映射也能正常找到文件:
Node.js的作用域包解析规则:当你写
import { RouterModule } from '@angular/router'时,@angular是一个作用域包(以@开头的npm包标准格式),Node.js会自动在项目根目录的node_modules文件夹下,定位@angular目录,然后在里面找到router子模块。这是Node模块系统的默认行为,完全不需要额外配置。Angular子模块的package.json入口定义:每个
@angular的子模块(比如router、common)自己的文件夹里都有package.json文件,里面的main字段会明确指定该模块的入口文件。比如@angular/router/package.json里的main可能是bundles/router.umd.js或者index.js,Angular CLI底层依赖的Webpack会读取这个字段,精准找到对应的编译好的模块文件。Angular CLI/Webpack的默认模块查找路径:Angular CLI初始化项目时,已经默认把
node_modules配置为Webpack的模块查找目录之一了,所以Webpack会自动去这里检索所有第三方包,包括@angular系列的所有子模块。
至于你没找到类似"@angular": "./node_modules/@angular"的配置,是因为这种显式路径映射(一般在tsconfig.json的paths字段里配置)只用于自定义项目内部的别名,比如把你自己项目里某个常用文件夹用短路径导入,第三方包根本不需要这么做——Node和Webpack已经帮你搞定了完整的查找逻辑。
如果想验证的话,你可以去项目的node_modules/@angular/router目录下打开package.json,看看里面的main字段,就能直观明白Webpack是怎么定位到具体文件的啦!
内容的提问来源于stack exchange,提问作者ButtahNBred

