Parcel 模块解析

2020-02-14 17:26 更新

模块解析

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

模块解析

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

模块解析可以相对于:

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

绝对路径

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

波浪号路径

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

Glob 文件路径

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

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

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

package.json browser 字段

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

别名

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

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

// package.json
{
  "name": "some-package",
  "devDependencies": {
    "parcel-bundler": "^1.7.0"
  },
  "alias": {
    "react": "preact-compat",
    "react-dom": "preact-compat",
    "local-module": "./custom/modules"
  }
}

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

  • ~ 被 Parcel 用来处理 波浪号路径
  • @ 被 npm 解释成 npm 组织(译者注:如@babel 是 babel 组织下的 npm 包)

我们建议在定义别名时要明确,所以最好指出文件的扩展名,而不是让 Parcel 猜。请看这个例子 JavaScript 命名导出

常见问题

JavaScript 命名导出

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

// package.json
{
  "name": "some-package",
  "alias": {
    "ipcRenderer": "./electron-ipc.js" // 指定文件扩展名
  }
}

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

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

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

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

这里有个文件结构如下:

package.json
.flowconfig
src/
  index.html
  index.js
  components/
    apple.js
    banana.js

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

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

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

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

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

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

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

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

TypeScript ~ 解析

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

// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "~*": ["./src/*"]
    }
  }
}

Monorepo 解析

下列是 Monorepo 目前建议的用法

建议:

  • 使用相对路径
  • 若使用根目录时,使用 /

不建议:

  • 避免在 monorepo 中使用 ~

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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号