Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NPM中作为混合包的节点的Typescript库_Node.js_Typescript_Npm_Ecmascript 6_Commonjs - Fatal编程技术网

Node.js NPM中作为混合包的节点的Typescript库

Node.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.

如何正确配置typescript
tsconfig.json
npm
package.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};
无误可用。我错过了什么