【问题标题】:Typescript modules resolving打字稿模块解析
【发布时间】:2020-07-24 10:30:48
【问题描述】:

我已经启动了一个新的 ts 项目,文件结构如下:

/src
    /dir1
        /dir2
            app.ts
    /dir3
        index.ts

我以这样的方式在index.ts 中导入模块app.tsimport app from '../dir1/dir2/app.ts'

我想用这样的别名 @ 编写代码: import app from '@/dir1/dir2/app.ts' 或者至少喜欢import app from 'dir1/dir2/app.ts'

阅读文章和文档我发现问题可以通过像这样添加baseUrltsconfig.json 来解决:

{
  "compilerOptions": {
    "module": "CommonJS",
    "target": "es2020",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "outDir": "dist",
    "esModuleInterop": true,
    "baseUrl": "./src"
  },
  "include": [
    "src/**/*"
  ],
}

但是,结果文件index.js 需要dir1/dir2/app,并带有一条消息:Error: Cannot find module。我可以只使用 TypeScript 设置,而不使用 Babel、Webpack 和其他大型库来处理这个问题吗?

【问题讨论】:

  • 别名是不好的方法,因为当你想创建另一个包并且你想将此包添加为依赖项时,如果其他包具有相同文件结构的相同别名,它将失败。
  • 好的。有没有办法避免相对进口,或任何避免手段“别名”?绝对路径好吗?
  • 如果你可以使用完整的包名而不是简单的@,例如,如果包名为@company/support-app,那么你可以将@company/support-app设置为root的别名,这样,即使如果将此包作为依赖项添加,则其路径将类似于节点样式路径。在节点中你可以使用以包名开头的绝对路径,你可以配置你的加载器来做同样的事情。
  • 我完全确定我的项目永远不会成为其他人的依赖项。因此,我看到@company/support-app 有点压倒性。使用import app from 'dir1/dir2/app' 是个好方法吗?避免多个../ 序列的另一种方法是什么?
  • 请注意,所有对话都只是关于项目模块,而不是来自node_modules

标签: javascript typescript commonjs


【解决方案1】:

不应该是import app from '/dir1/dir2/app.ts'

可能有用https://css-tricks.com/quick-reminder-about-file-paths/

【讨论】:

    【解决方案2】:

    baseUrl 将启用相对于它的非相对外观的模块分辨率。

    如果您使用"baseUrl": "./src",那么您可以像这样导入/src 中的任何模块:

    import app from 'dir1/dir2/app.ts' // this is still relative to the /src dir
    

    如果您想使用“@”之类的前缀,则可以使用 paths 编译器选项,该选项将重新映射相对于 baseUrl 的导入位置。

    {
      "baseUrl": "/src",
      "paths": {
        "@dir1/*": ["./dir1/*"] // map imports from @dir1/ to ./dir1
      }
    }
    

    用法:

    import app from '@dir1/dir2/app' 
    

    Relative and Non-relative imports

    【讨论】:

    • 是否可以选择将生成的 dist 路径转换为相对路径:从 @dir1/dir2/app../dir1/dir2/app
    • @avdotion,你是什么意思? ../dir1/dir2/app 是 TS 模块的默认导入语法。您的问题要求用@dir1/dir2/appdir1/dir2/app 替换../dir1/dir2/app 的方法
    • 我想在编译过程中将绝对路径转换为相对路径,写入.ts文件@dir1/dir2/app并进入dist.js文件../dir1/dir2/app
    • 我的回答将允许您在 TS 模块中编写 @dir1/dir2/app,这些模块将被正确编译为 ../dir1/dir2/app
    • 有通用的解决方案吗? "paths": {"@*": ["*"]}, 也返回 '@dir1/dir2/app'
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2022-01-07
    • 2019-11-01
    • 2018-07-30
    • 2023-03-29
    • 2021-10-04
    • 2017-01-22
    • 2021-07-06
    相关资源
    最近更新 更多