npm多个模块和主要入口点

时间:2019-05-14 18:19:33

标签: javascript node.js npm es6-modules

我正在构建一个支持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.jsesm/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/的路径?

1 个答案:

答案 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'