javascript - 更改 JavaScript 中的默认文件分辨率

标签 javascript typescript

在 JavaScript 项目中,可以导入名为 index.js 的文件,如下所示:

import SomeComponent from 'components/some-component'

而不必指定 index.js

在我的项目中,我更喜欢使用不同的命名约定:some-component.component.js。这样我一眼就能看出文件是什么(而不是拥有一百万个 index.js)。

我想要实现的目标是对于具有模式 *.component.js 的文件发生相同的导入模式。换句话说:

import SomeComponent from 'components/some-component'

而不是

import SomeComponent from 'components/some-component/some-component.component.js'

我有以下(缩写)jsconfig.json:

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "*": ["./*"]
    }
  }
}

关于如何实现这一目标有什么想法吗?

提前致谢!

最佳答案

简短回答:您无法使用函数(或 RegExp)自定义导入解析。对于 Web 项目,您可以使用 Webpack 之类的工具和自定义加载器。但是,这是一个特定于 Webpack 的解决方案,无法与其他工具一起使用(例如在 VSCode 中按住 Ctrl 键单击,或直接使用 TSC)。

长答案:

JavaScript 文件的分辨率取决于您使用的工具。这些年来,标准发生了一些变化,虽然事情正在向 ESM 靠拢,但仍然存在很多不一致之处。

TypeScript 模块分辨率描述如下:https://www.typescriptlang.org/docs/handbook/module-resolution.html 您可以拥有一个 baseUrl,将多个目录合并为一个 (rootDirs),或者拥有有限的通配符 path 映射 ( https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping )。您已经在问题中使用过它,所以我可能不会告诉您任何新内容。但是,TS 配置选项就到此为止了。 (您可以使用 TSC API 自定义编译模块分辨率,但不能从 CLI/工具配置选项中自定义)

NodeJS 可以为模块 Hook 解析机制。例如,Yarn 2+ 这样做是为了支持称为 PNP ( https://yarnpkg.com/features/pnp ) 的功能。但是,TypeScript 仍然需要解析类型,并且它不会使用您的自定义加载机制。 Webpack 等其他工具的情况类似。

Node 和 TypeScript 的模块解析特定于这些工具。 ESM 标准更加严格:from 部分必须是绝对或相对 URL,或者是需要使用导入映射进行映射的“裸标识符”。换句话说,您无法使用自定义算法来解析路径。导入 map 标准存储库中描述了这样做的理由:https://github.com/WICG/import-maps#a-programmable-resolution-hook

结论:如果您真的非常想要进行自定义模块解析,您可以使用 TSC API 创建自己的 CLI。这可能不适用于其他工具,并且可能更容易习惯其他命名约定。

关于javascript - 更改 JavaScript 中的默认文件分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70039355/

相关文章:

javascript - 如何定位超出其各自功能范围的 "this"?

javascript - 带有弹出窗口的(多边形形状)图层顶部带有弹出窗口的 Mapbox 标记显示 2 个弹出窗口

typescript - 在单独的文件中创建 typerscript 类并在 angular2 组件中使用它们

javascript - 如何使用 JavaScript 加载和解析服务器中的静态 JSON 文件

javascript - Ajax 查询字符串未发布到 ASP.NET Controller

javascript - 按键时增加变量的值

javascript - 如何创建日志 channel 命令?

node.js - typeORM: "message": "Data type\"对象\"in\".. ."is not supported by\"postgres\"database."

typescript - 已加载应用程序的 Typescript 的 REPL

javascript - 使用 ORM (TypeORM) 设计三维关系