我正在尝试将包含 CommonJs 和 esm 的 TS 包发布到 NPM,但我遇到了 2 个问题。 1-我似乎无法将 esm 文件构建为 .mjs 文件,作为解决方法,我在将文件发布到 npm 之前手动编辑文件扩展名,但我不确定这是否是正确的做法,所以关于这个问题的所有见解都会很棒。 2-当尝试从该包导入任何内容时,我的主文件没有任何问题,但如果我尝试从任何其他文件导入,我会收到此错误:
Cannot find module 'nizar-npm-publish-test/mult/multiply' or its corresponding type declarations.ts(2307)
这是我的TS包的结构:
这就是我用于构建的内容: 包.json:
"main": "index.js",
"files": [
"build/cjs",
"build/esm",
"build/@types"
],
"types": "build/@types",
"exports": {
".": {
"import": "./build/esm/index.mjs",
"require": "./build/cjs/index.js"
},
"./*": {
"import": "./build/esm/*.mjs",
"require": "./build/cjs/*.js"
},
"./mult/*": {
"import": "./build/esm/mult/*.mjs",
"require": "./build/cjs/mult/*.js"
},
"./types":"./build/@types/index.d.ts",
"./types/*": "./build/@types/*.d.ts",
"./types/mult/*":"./build/@types/*.d.ts"
},
"scripts": {
"clean": "rimraf build",
"build": "yarn clean && yarn build:esm && yarn build:cjs && yarn build:types",
"build:esm": "tsc -p tsconfig.prod.json --module ES2022 --outDir build/esm",
"build:cjs": "tsc -p tsconfig.prod.json --module commonjs --outDir build/cjs",
"build:types": "tsc --p tsconfig.types.prod.json -emitDeclarationOnly",
"test": "echo \"Error: no test specified\" && exit 1",
"launch": "npx ts-node src/index"
},
tsconfig.json:
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Default",
"compilerOptions": {
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"isolatedModules": true,
"incremental": true,
"rootDir": ".",
"outDir": "build",
"sourceMap": false,
"target": "ESNext",
"noEmit": false,
"module": "CommonJS",
"moduleResolution": "node",
"declaration": true
},
"ts-node": {
"require": ["tsconfig-paths/register"]
},
"include": ["."],
"exclude": ["build", "node_modules", ".turbo", "coverage", "dist"],
"moduleResolution": ["node_modules", "node"]
}
还有 tsconfig.types.prod.json:
{
"extends": "./tsconfig.json",
"compilerOptions": {
"composite": false,
"outDir" : "build/@types"
},
"exclude": [
"build",
"coverage",
"node_modules",
".turbo",
"coverage",
"dist",
"**/__test__",
"__test__",
"__mocks__",
"**/__mocks__",
"*.config.js",
"*.config.ts",
".env",
"src/**/*.test.ts"
]
}
PS:它们(
和add
功能)都可以工作,我只需要解决TS错误。multiply
更新: 在我找到的解决方法中,我不再需要
.mjs
部分,但是,它对于解决方案来说非常丑陋,任何改进它的帮助都会很棒:
首先我将导出更新为:
"main": "build/cjs/index.js",
"module": "build/esm/index.js",
"types": "build/esm/index.d.ts",
"files": [
"build/cjs",
"build/esm"
],
"exports": {
".": {
"import": "./build/esm/index.js",
"require": "./build/cjs/index.js",
"types": "./build/esm/index.d.ts"
},
"./*": {
"import": "./build/esm/*.js",
"require": "./build/cjs/*.js",
"types": "./build/esm/*.d.ts"
}
最终创建了这棵新树:
每个新的 package.json 文件现在都包含与此类似的对象。
{
"name": "substract",
"description": "This way it's recognizable by the TypeScript compiler",
"main": "../build/cjs/substract.js",
"module": "../build/esm/substract.js",
"types": "../build/esm/substract.d.ts"
}
现在的问题是,如果我有很多稍后要导入的文件,这将导致我创建尽可能多的 package.json 文件。