如何在 TypeScript 中创建本地模块

Posted

技术标签:

【中文标题】如何在 TypeScript 中创建本地模块【英文标题】:How to create a local module in TypeScript 【发布时间】:2019-05-11 23:27:32 【问题描述】:

我在文件夹 src/modules/my-module/ 中创建了 package.json 并定义了导出我们需要的所有内容的主文件。

我现在可以从中导入 import A from '../../modules/my-module'

我想把语法改成import A from 'my-module',有几个原因:

当我将模块移动到另一个文件夹时,我不想更改调用此模块的所有代码。 稍后,我希望能够将该模块作为 npm 包移动到单独的存储库中,并在多个项目中重用它。我不想稍后更改所有调用代码。

我已经设法通过添加到tsconfig.json来编译它

"paths": 
  "my-module": ["src/modules/my-module"]

但我无法通过 node.js 运行结果,因为节点找不到模块。有没有办法在这种情况下使用非真实模块引用。

【问题讨论】:

将该路径附加到NODE_PATH 环境变量。 有没有办法通过 package.json 做到这一点?我需要一种可移植的方式,以便它可以提交给 git 并被其他团队成员重用。 我不确定你能否做得更好。 npm run 和/或脚本可能会有所帮助。 这能回答你的问题吗? How to share code between TypeScript projects? 【参考方案1】:

在将 ts 文件转换为 js 时,TS 不会转换那个“我的模块”。

使用module-alias 包可能会解决您的问题。

将此配置添加到 package.json 中:

"_moduleAliases": 
   "my-module": "<your_build_folder>/modules/my-module"
,

这段代码在你的主文件 (server.ts/index.ts) 的第一行

import 'module-alias/register';

【讨论】:

谢谢,它有效。我期待一些更漂亮的东西,但它仍然是一个解决方案。【参考方案2】:

听上去,你想要做的是打包你的本地my-module,这样它就可以像你安装和使用来自 npm 注册表的包一样使用 /em>。

当您进行本地开发时,很容易配置一个依赖项以引用您的模块作为文件路径 - 尽管您需要将您的 typescript 进行转译才能在您的情况下工作。

这是我用于本地开发的方法,在我们有许多用于微服务架构的实用程序模块的环境中。我将模块打包成一个存档并使用npm install 安装它:


使用npm pack 将模块打包成.tgz。我们的package.json 定义了要打包的目标目录,build 脚本执行转译到目标(显然根据您的需要进行调整):
  ...
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "files": [
    "dist"
  ],
  "scripts": 
    "build": "npx babel src --out-dir dist --extensions .ts,.tsx,.js --ignore **/*.test.ts,**/*.test.tsx",
  ...
运行npm pack 并将生成的包安装到您的应用程序中
/my-module/> npm pack
/my-module/> cd ../my-app
/my-app/> npm install --save ../my-module/my-module-0.0.1.tgz

或作为一体机(在my-app 目录中构建tgz):

/my-app/> && npm pack ../my-module && npm i -s my-module-0.0.1.tgz

完成开发后,您可能希望以在部署时可用于项目的方式发布模块。

您的选择大致如下:

使用npm link 发布到您的本地系统 发布到私有注册表 发布到 npm 注册表(作为公共或私有模块)

以下是这些选项的好资源:https://medium.com/@debshish.pal/publish-a-npm-package-locally-for-testing-9a00015eb9fd

【讨论】:

【参考方案3】:

将本地模块作为依赖项添加到 package.json(在项目的根目录中):

  "dependencies": 
    "my-module": "file:src/modules/my-module",
    ...
  

像这里@tsconfig/recommended一样配置您的打字稿设置

在您的根文件夹中运行 npm install my-module

那么你可以这样做:

import A from 'my-module'

【讨论】:

【参考方案4】:

您可以从 2018 年 7 月的 Typescript 3 开始转换您的外部本地项目(参考项目)。

见:How to share code between TypeScript projects?

【讨论】:

以上是关于如何在 TypeScript 中创建本地模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中创建循环引用类型?

如何在 JavaScript/TypeScript 中创建具有非唯一键的地图?

如何使用 bit 在 javascript 项目中创建 typescript 组件?

如何在 Typescript 中创建一个空字符串数组?

如何在 Typescript 类中创建 Angular 5 HttpClient 实例

Node.js 和 Typescript,如何动态访问导入的模块