Node.js NPM中作为混合包的节点的Typescript库
如何正确配置typescriptNode.js NPM中作为混合包的节点的Typescript库,node.js,typescript,npm,ecmascript-6,commonjs,Node.js,Typescript,Npm,Ecmascript 6,Commonjs,如何正确配置typescripttsconfig.json和npmpackage.json以创建混合npm包 我基本上遵循了(但我也尝试了其他方法) 这是我的库的alpha版本。我在这里描述的最后一个状态是。我想使用ESM作为基本导入,使用CommonJS作为选项。这在中进行了描述。通过index.tsclassgomshal、枚举和接口创建我的lib文件 项目结构 我的源代码在“/src/lib”中。我有两个tsconfig.json文件:tsconfig.esm.json和tsconfig.
tsconfig.json
和npmpackage.json
以创建混合npm包
我基本上遵循了(但我也尝试了其他方法)
这是我的库的alpha版本。我在这里描述的最后一个状态是。我想使用ESM作为基本导入,使用CommonJS作为选项。这在中进行了描述。通过index.ts
classgomshal、枚举和接口创建我的lib文件
项目结构
我的源代码在“/src/lib”
中。我有两个tsconfig.json文件:tsconfig.esm.json
和tsconfig.cjson
。两者都包含相同的”/src/lib/***.ts“
文件作为源文件。编译器选项中有不同的选项:
// tsconfig.cjs.json for CommonJS
"compilerOptions": {
"outDir": "./build/lib/cjs",
"target": "ES5",
"module": "CommonJS",
...
}
// tsconfig.esm.json for ES6 module
"compilerOptions": {
"outDir": "./build/lib/esm",
"target": "ES2015",
"module": "ES2015",
...
}
此外,我还有一个文件package.json
专门用于commonjs,内容为:{“type”:“commonjs”}
。my root package.json中的重要键包括:
{
"type": "module",
"main": "./build/lib/esm/index.js",
"module": "./build/lib/esm/index.js",
"typings": "./build/lib/esm/index.d.ts",
"files": [ "build/lib/**/*" ],
"exports": {
"./esm": "./build/lib/esm/index.js",
"./cjs": "./build/lib/cjs/index.js"
},
...
}
因此,这里的所有内容默认都是针对ES6模块的。编译(tsc-p tsconfig.esm.json
和tsc-p tsconfig.cjson
)后,在生成目录中创建两个文件夹(build/lib/cjs
和build/lib/esm
)。来自src/cjs
的包json文件被压缩到build/lib/cjs
中,所有内容看起来都可以发布了。现在,当我使用此设置尝试npm-pack
时,将生成的tgz文件和npm-install
复制到演示项目中(属于package.json
:“type”:“module”,“dependencies”:{“gomshal”:“file:gomshal-1.4.2.tgz”}
),最小演示index.js
:
从'Gomshal'导入{Gomshal};
gomshal=新的gomshal();
返回错误ERR_MODULE_NOT_FOUND:
node .\index.js
(node:23404) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/resolve.js:58
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find module D:\Workspace\gomshal\npmtest\node_modules\gomshal\build\lib\esm\gomshal imported from D:\Workspace\gomshal\npmtest\node_modules\gomshal\build\lib\esm\index.js
at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:58:13)
at Loader.resolve (internal/modules/esm/loader.js:85:40)
at Loader.getModuleJob (internal/modules/esm/loader.js:188:40)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
at link (internal/modules/esm/module_job.js:41:36) {
code: 'ERR_MODULE_NOT_FOUND'
节点。\index.js
(节点:23404)实验警告:ESM模块加载程序是实验性的。
内部/modules/esm/resolve.js:58
设url=moduleWrapResolve(说明符,parentURL);
^
错误:找不到从D:\Workspace\gomshal\npmtest\node\u modules\gomshal\build\lib\esm\gomshal导入的模块D:\Workspace\gomshal\npmtest\node\u modules\gomshal\build\lib\esm\index.js
在Loader.defaultResolve[as_resolve](internal/modules/esm/resolve.js:58:13)
在Loader.resolve(internal/modules/esm/Loader.js:85:40)
在Loader.getModuleJob(internal/modules/esm/Loader.js:188:40)
在ModuleWrap。(内部/modules/esm/module_job.js:42:40)
at链接(内部/modules/esm/module_job.js:41:36){
代码:“错误模块未找到”
我在root package.json中尝试了其他变体(“main”
针对cjs和“module”
针对esm编译代码和“exports”
键中的其他组合),但在这种情况下,我可能最接近混合包。我的节点版本是13.8.0,npm 6.13.6,tsc版本3.8.3
但是,我仍然无法配置我的npm包使命名的ESM导入从“Gomshal”导入{Gomshal};
无误可用。我错过了什么