Typescript 被转换为 JavaScript,因此模块routes.ts被转换到放置它的routes.js目录中tsc。如果另一个模块从模块导入名称(例如“路由器”),我们将省略后缀,如下所示:
import { router } from './routes'
Run Code Online (Sandbox Code Playgroud)
这工作得很好,直到节点停止用作.js默认后缀。从节点 V16(或者可能更早?)开始,有必要添加该标志
--es-module-specifier-resolution=node才能使用节点运行转译代码。在后来的 NodeJS 版本中,这个选项被默默地转换为降级
--experimental-specifier-resolution=node,然后在 NodeJS v19 中被完全删除。
现在,在 NodeJS v19 中,人们应该改用“自定义加载器”。运行转译的 TypeScript 代码真的那么难吗?推荐的方法是什么?
(SO:说这个问题重复了相关问题Appending .js extension onrelative import statements during Typescript Compilation (ES6modules),但是这个问题有更多关于不同版本的nodeJS的信息——它是相关的,所以人们可能想检查出来。)
我正在尝试使用ES6模块解析将一个Typescript项目编译为JS,但似乎有些不对劲.
我的tsconfig.json看起来像这样:
{
"compilerOptions": {
"module": "es6",
"target": "es6",
"sourceMap": true,
"lib": ["es6"]
}
}
Run Code Online (Sandbox Code Playgroud)
我用两个模块构建了一个简单的测试用例.第一个模块(module1.ts)只导出一个常量:
export const testText = "It works!";
Run Code Online (Sandbox Code Playgroud)
第二个模块(main.ts)只是从第一个模块导入导出:
import { testText } from 'module1';
alert(testText);
Run Code Online (Sandbox Code Playgroud)
第二个模块(main.js)的输出文件包含在我的index.html中,带有type="module"-Attribute:
<script src="main.js" type="module"></script>
Run Code Online (Sandbox Code Playgroud)
当我使用Firefox(dom.moduleScripts.enabled在about:config中设置)和Chrome Canary(实验Web平台标志设置)进行测试时.在这两种情况下它都不起作用.
Typescript编译器似乎将TS import { testText } from 'module1';语句转换为JS语句import { testText } from 'module1';.(注意:两者完全一样)
正确的ES6 import语句将是:(
import { testText } from 'module1.js';
注意.js文件扩展名)如果我手动将文件扩展名添加到生成的代码中,它就可以工作.
我做错了什么或者Typescript "module": "es6"设置不正常吗?有没有办法以这样的方式配置tsc:.js文件扩展名被添加到生成的import语句中?
我决定将我的 js 项目迁移到 ts 中,但是我面临以下问题:ts 文件中的所有导入在编译的 js 文件中都缺少 .js 扩展名。这又会Loading failed for the module with source \xe2\x80\x9chttp://localhost:5500/build/test/first\xe2\x80\x9d.在我的浏览器控制台上引发以下错误:\n。这是代码
/src/index.html
\n\n<!DOCTYPE html>\n<html lang="en">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n<title>Document</title>\n</head>\n<body>\n</body>\n<script src="/build/test/last.js" type="module"></script>\n</html>\nRun Code Online (Sandbox Code Playgroud)\n\n/src/test/first.ts
\n\nexport class First {\n name: string;\n\n constructor(name: string) {\n this.name = name\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n/src/test/last.ts
\n\nimport {First} from "./first"\nclass Last {\n\n constructor() {\n let name = new First("this is my name").name;\n console.log(name)\n }\n}\n\nnew Last();\nRun Code Online (Sandbox Code Playgroud)\n\n/build/test/first.js
\n\nexport class First {\n constructor(name) {\n this.name = …Run Code Online (Sandbox Code Playgroud) 我已经将 NodeJS 项目的代码更改为 Typescript。一切工作正常,除了显然第三方包(文件类型,https://www.npmjs.com/package/file-type)似乎不接受require编译.js文件中生成的。要改变这一点,我必须将 tsconfig.json 的“module”属性更改为“commonjs”以外的另一个值。然而,它破坏了代码并产生了很多问题。
我的 tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"allowJs": true,
"lib": ["ES6"],
"esModuleInterop": true,
"moduleResolution": "node",
"outDir": "build",
"rootDir": "src",
"skipLibCheck": true,
"strict": true
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
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> …Run Code Online (Sandbox Code Playgroud) 自动导入完成功能有时会添加.js扩展名,但并非总是如此。但是,如果 TypeScript 源中没有扩展名,tsc编译器不会将扩展名添加到发出的 JavaScript 文件中,这可能会导致运行时问题,例如找不到模块错误。
有关问题的详细信息,请参阅:在 Typescript 编译期间在相对导入语句上附加 .js 扩展名(ES6 模块)。
问题是:有没有办法配置自动导入完成功能以强制.js在导入语句中附加扩展名?或者是否有任何附加组件或 VS Code 扩展可以实现此目的?
这个小事有时非常烦人!
如果我导入文件import * as test from './dir/file',则构建中缺少 .js 扩展名
我想要这样的输出文件import * as test from './dir/file.js'
问题是:是的,我可以手动添加 .js,但许多库没有手动添加 .js 扩展名,而且我不想遍历库的所有文件并手动添加扩展名。
我知道有一些正则表达式替换器添加了 .js 扩展名。但这是唯一的方法吗?有没有办法告诉 TypeScript 添加 .js (也许通过 tsconfig.json)???