我正在构建一个支持CommonJS和ES模块的软件包。对于单个入口点,我的工作正常。我将代码编写为ESM,然后在发布前使用Babel将其编译为CJS。我的package.json
的相关内容如下:
"main": "cjs/",
"module": "esm/",
"scripts": {
"test": "jest ./test",
"clean": "rm -rf cjs",
"build": "npm run clean && babel esm --out-dir cjs",
"prepare": "npm test && npm run build"
}
所以我的index.js
在esm/index.js
中,并且cjs/index.js
在发布该程序包之前不存在。当使用require
(例如const myPackage = require('my-package')
)包含该软件包时,它将从cjs/
中提取。如果是导入的(例如import myPackage from 'my-packge'
),它将从esm/
提取。
我的问题是我希望能够从包中导入其他文件(例如import adapter from 'my-package/adapters/mysql'
或const adapter = require('my-package/adapters/mysql')
)。但是,如果以这种方式包含它,将找不到该文件。
我可以使用完整路径(例如import adapter from 'my-package/esm/adapters/mysql'
或const adapter = require('my-package/cjs/adapters/mysql')
)将其导入。但是我不想在路径中明确指定模块类型。似乎node已经知道如何分辨CJS和ES模块之间的区别(它知道需要main
并需要从module
导入),所以我希望可以做到这一点多个文件。
如上所述,是否有任何方法可以包含软件包,而不必显式指定esm/
或cjs/
的路径?
答案 0 :(得分:0)
//the project(package) mcktools's package.josn
"main": "dist/index.js",
"exports": {
".": "dist/index.js",
"./cmd": "dist/nodejs",
"./web": "dist/web",
}
//js import the package mcktools:
import {file} from 'mcktools/cmd'