相关疑难解决方法(0)

nodeJS v19 放弃了对 --es-module-specifier-resolution=node 的支持,这使得运行转译的 TypeScript 变得更加困难

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的信息——它是相关的,所以人们可能想检查出来。)

node.js typescript

18
推荐指数
1
解决办法
7911
查看次数

Typescript编译器忘记为ES6模块导入添加文件扩展名?

我正在尝试使用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语句中?

javascript typescript ecmascript-6 es6-modules

10
推荐指数
2
解决办法
1129
查看次数

Typescript 导入编译为 javascript 时缺少 .js 扩展名

我决定将我的 js 项目迁移到 ts 中,但是我面临以下问题:ts 文件中的所有导入在编译的 js 文件中都缺少 .js 扩展名。这又会Loading failed for the module with source \xe2\x80\x9chttp://localhost:5500/build/test/first\xe2\x80\x9d.在我的浏览器控制台上引发以下错误:\n。这是代码

\n\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>\n
Run Code Online (Sandbox Code Playgroud)\n\n

/src/test/first.ts

\n\n
export class First {\n    name: string;\n\n    constructor(name: string) {\n        this.name = name\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

/src/test/last.ts

\n\n
import {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();\n
Run Code Online (Sandbox Code Playgroud)\n\n

/build/test/first.js

\n\n
export class First {\n    constructor(name) {\n        this.name = …
Run Code Online (Sandbox Code Playgroud)

javascript typescript ecmascript-6

8
推荐指数
1
解决办法
3599
查看次数

有没有办法在 TS 文件中结合 ES6 导入和 commonJS require ?

我已经将 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)

javascript typescript

8
推荐指数
1
解决办法
4376
查看次数

在 TypeScript Visual Studio 代码编辑器中强制自动导入使用“.js”扩展名

自动导入完成功能有时会添加.js扩展名,但并非总是如此。但是,如果 TypeScript 源中没有扩展名,tsc编译器不会将扩展名添加到发出的 JavaScript 文件中,这可能会导致运行时问题,例如找不到模块错误。

有关问题的详细信息,请参阅:在 Typescript 编译期间在相对导入语句上附加 .js 扩展名(ES6 模块)

问题是:有没有办法配置自动导入完成功能以强制.js在导入语句中附加扩展名?或者是否有任何附加组件或 VS Code 扩展可以实现此目的?

这个小事有时非常烦人!

javascript node.js typescript visual-studio-code

7
推荐指数
1
解决办法
2669
查看次数

在 TypeScript 构建中添加 .js 扩展名

如果我导入文件import * as test from './dir/file',则构建中缺少 .js 扩展名

我想要这样的输出文件import * as test from './dir/file.js'

问题是:是的,我可以手动添加 .js,但许多库没有手动添加 .js 扩展名,而且我不想遍历库的所有文件并手动添加扩展名。

我知道有一些正则表达式替换器添加了 .js 扩展名。但这是唯一的方法吗?有没有办法告诉 TypeScript 添加 .js (也许通过 tsconfig.json)???

javascript module node.js typescript tsconfig

5
推荐指数
1
解决办法
6570
查看次数