可能是有史以来最愚蠢的问题,但是我有一个Node项目正在使用带有--experimental-modules
和Node 12的ES模块。
现在,我要向用主节点应用消耗的Typescript编写的monorepo添加一个内部包。我正在为自己的Typescript构建设置而苦苦挣扎,这些设置会产生一些可以与--experimental-modules
一起使用的东西。
当前为tsconfig.json:
{
"include": [
"src/**/*ts"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
],
"compilerOptions": {
"module": "esnext",
"esModuleInterop": true,
"target": "esnext",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist"
},
"lib": ["es2015"]
}
如果我有index.ts
从邻居ts文件导入:
import { schema } from './schema'
内置的import语句不包含任何.js
,这使我的节点应用程序感到窒息:
(node:78972) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/default_resolve.js:79
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find module /Users/viktor/dev/projects/kb-frontend/packages/graph/dist/schema imported from /Users/viktor/dev/projects/kb-frontend/packages/graph/dist/index.js
原因是导入没有.js
-在ts构建的dist目录中对其进行修补即可。
我不能简单地将ts模块更改为commonjs,因为这也会改变我的主要出口产品与基于esm的主要产品一起工作的方式,从而给我带来其他错误:
import { server as graphMiddleware } from '@kb-front/graph'
^^^^^^
SyntaxError: The requested module '@kb-front/graph' does not provide an export named 'server'
我不想在这里和那里添加很多.default
,因为我的整个设置是一起避免 commonjs,而只将js和typescript与esm一起使用。嘿,我想要新的闪亮东西。
我想念什么?
答案 0 :(得分:0)
在带有Typescript的浏览器中使用本机模块支持的两个问题:
https://github.com/microsoft/TypeScript/issues/13422 https://github.com/microsoft/TypeScript/issues/16577
从他们那里我得到了可以使用.js扩展名导入的技巧。超级奇怪,但适用于我的情况。