如何在 TypeScript 中创建本地模块

Sea*_*ull 7 javascript node.js node-modules typescript

我已经在文件夹中创建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"]
}
Run Code Online (Sandbox Code Playgroud)

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

bra*_*zoo 5

听起来,您想要做的就是打包本地文件my-module,以便可以像安装和使用 npm 注册表中的包一样使用它

当您进行本地开发时,可以轻松配置依赖项以将模块引用为文件路径 - 尽管您需要转换打字稿才能使其在您的情况下工作。

这是我用于本地开发的方法,在一个环境中,我们有许多用于微服务架构的实用程序模块。我将模块打包到存档中并使用以下命令安装它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",
  ...
Run Code Online (Sandbox Code Playgroud)
  • 在您的应用程序中运行npm pack并安装生成的包
/my-module/> npm pack
/my-module/> cd ../my-app
/my-app/> npm install --save ../my-module/my-module-0.0.1.tgz
Run Code Online (Sandbox Code Playgroud)

或者作为一体化(构建tgzmy-app目录中):

/my-app/> && npm pack ../my-module && npm i -s my-module-0.0.1.tgz
Run Code Online (Sandbox Code Playgroud)

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

您的选择大致如下:

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

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


小智 3

将 ts 文件转译为 js 时,TS 不会转换“my-module”。

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

将以下配置添加到 package.json 中:

"_moduleAliases": {
   "my-module": "<your_build_folder>/modules/my-module"
},
Run Code Online (Sandbox Code Playgroud)

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

import 'module-alias/register';
Run Code Online (Sandbox Code Playgroud)