📔 模块解析

Parcel 解析器实现了一版改进后的node_modules 解析算法

模块解析

除了标准算法,所有Parcel 支持的资源种类 都可以被解析

模块解析可以相对于:

  • 入口根目录:指定给 Parcel 的入口目录,或者多个入口执定的共享根目录(同一个父目录)。
  • 包的根目录node_modules 中最接近模块根的目录。

绝对路径

/foo相对于入口根目录解析成foo

波浪号路径

~/foo解析成foo相对于最近的包的根目录,如果不存在则是入口根目录

Glob 文件路径

Globs 可以使用通配符一次导入多个资源,匹配一些文件(/assets/.png),或者匹配多个目录中的文件(/assets/**/)

此示例打包了一个文件中的所有 png 并返回了 dist 的 URLs。

  1. import foo from '/assets/*.png'
  2. // {
  3. // 'file-1': '/file-1.8e73c985.png',
  4. // 'file-2': '/file-1.8e73c985.png'
  5. // }

package.json browser 字段

如果一个包的 package.json 包含 package.browser 字段,Parcel 将使用它替换 package.main 入口

别名

支持在package.json中设置alias 字段

这个例子的react别名是preact,而local-module并不是来自node_modules

  1. // package.json
  2. {
  3. "name": "some-package",
  4. "devDependencies": {
  5. "parcel-bundler": "^1.7.0"
  6. },
  7. "alias": {
  8. "react": "preact-compat",
  9. "react-dom": "preact-compat",
  10. "local-module": "./custom/modules"
  11. }
  12. }

应避免在你的别名中使用特殊字符,因为可能被 Parcel 和其他第三方工具或扩展使用。比如:

  • ~ 被 Parcel 用来处理 波浪号路径
  • @ 被 npm 解释成 npm 组织(译者注:如@babel 是 babel 组织下的 npm 包)我们建议在定义别名时要明确,所以最好指出文件的扩展名,而不是让 Parcel 猜。请看这个例子 JavaScript 命名导出

常见问题

JavaScript 命名导出

别名映射应用于很多种类的资源,但是并没有特别支持 JavaScript 命名导出。如果你想要这样做:

  1. // package.json
  2. {
  3. "name": "some-package",
  4. "alias": {
  5. "ipcRenderer": "./electron-ipc.js" // 指定文件扩展名
  6. }
  7. }

接着,在有别名的文件中重新导出

  1. // electron-ipc.js
  2. module.exports = require('electron').ipcRenderer

Flow 中的绝对路径和波浪号路径解析

解析这样的模块你需要配置 Flow 并且使用module.name_mapper特性

这里有个文件结构如下:

  1. package.json
  2. .flowconfig
  3. src/
  4. index.html
  5. index.js
  6. components/
  7. apple.js
  8. banana.js

src/index.html是入口,src/ 文件是入口根目录

因此,当前正确的引入映射是:

  1. // index.js
  2. import Apple from '/components/apple'

我们需要 Flow 将'/components/apple'前头的/替换成src/,这样就是'src/components/apple'

下面在.flowconfig的设置可以完成这个替换

  1. [options]
  2. module.name_mapper='^\/\(.*\)$' -> '<PROJECT_ROOT>/src/\1'

这里的<PROJECT_ROOT>在 Flow 里是一个特定的标识符代表.flowconfig所在的路径

注意:module.name_mapper可以有多个入口,除了别名,还可以支持绝对路径波浪号路径解析

TypeScript ~ 解析

TypeScript 需要了解你是如何使用 ~ 进行模块解析和别名映射。更多信息请参考 TypeScript 模块解析文档

  1. // tsconfig.json
  2. {
  3. "compilerOptions": {
  4. "baseUrl": ".",
  5. "paths": {
  6. "~*": ["./src/*"]
  7. }
  8. }
  9. }

Monorepo 解析

下列是 Monorepo 目前建议的用法

建议:

  • 使用相对路径
  • 若使用根目录时,使用 /不建议:

  • 避免在 monorepo 中使用 ~如果你是 monorepo 使用者且有意分享你的建议,请提交 issues 并提供一个范例以便讨论。

帮助我们改善文档

如果有遗漏或者不清楚的地方,请在本站的仓库 提交issue 或者 编辑此页面.