【发布时间】:2022-05-05 06:23:54
【问题描述】:
我已将用 NodeJS 制作的项目的代码更改为 Typescript。
一切正常,除了显然第三方包(文件类型,https://www.npmjs.com/package/file-type)似乎不接受在编译的.js 文件中生成的require。
要改变这一点,我必须将 tsconfig.json 的“模块”属性更改为“commonjs”以外的另一个值。但是,它破坏了代码并产生了很多问题。
我的 tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"allowJs": true,
"lib": ["ES6"],
"esModuleInterop": true,
"moduleResolution": "node",
"outDir": "build",
"rootDir": "src",
"skipLibCheck": true,
"strict": true
}
}
我得到的错误:
const filetype = __importStar(require("file-type"));
^
Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\user\Desktop\repos\art-api\node_modules\file-type\index.js from C:\Users\user\Desktop\repos\art-api\build\middlewares\process-image.js not supported.
Instead change the require of index.js in C:\Users\user\Desktop\repos\art-api\build\middlewares\process-image.js to a dynamic import() which is available in all CommonJS modules.
at Object.<anonymous> (C:\Users\user\Desktop\repos\art-api\build\middlewares\process-image.js:33:31)
at Object.<anonymous> (C:\Users\user\Desktop\repos\art-api\build\controllers\artworkControllers.js:19:25)
at Object.<anonymous> (C:\Users\user\Desktop\repos\art-api\build\routers\artworkRouter.js:7:30)
at Object.<anonymous> (C:\Users\user\Desktop\repos\art-api\build\server.js:9:41) {
code: 'ERR_REQUIRE_ESM'
}
显然,问题在于 JavaScript 中生成的代码与使用 ES6 导出语法的包的代码冲突。如果这是正确的,我该如何解决这个问题? 有没有办法只为这个特定的包生成带有导入语法的 .js 代码,或者类似的解决方法? 代码的其他部分没有给我任何问题,只有这个包的导入(文件类型)。
以防万一,这是“文件类型”的 index.js,其中包含编译器抱怨的导入:
import * as strtok3 from 'strtok3';
import {fileTypeFromTokenizer} from './core.js';
export async function fileTypeFromFile(path) {
const tokenizer = await strtok3.fromFile(path);
try {
return await fileTypeFromTokenizer(tokenizer);
} finally {
await tokenizer.close();
}
}
export * from './core.js';
【问题讨论】:
-
我今天早些时候在尝试将npmjs.com/package/callsites 与打字稿一起使用时遇到了完全相同的问题,但无法找到解决方案。
-
FWIW,here 是关于同时使用 ESM 和 CommonJS 的 Node.js 文档。我不知道如何配置 TypeScript 来处理这个问题。
-
@axtck 我终于找到了解决方法,试试这个解决方案是否适合你
-
@wrongbyte 会看看!
-
"我已经将 NodeJS 中的项目代码更改为 Typescript。" - 你是说你有一个纯 JS 项目的工作版本吗?它使用了什么导入样式?
标签: javascript typescript