如何让用户从我的 NPM 包的子文件夹中导入

Pav*_*ndu 6 import subdirectory npm typescript

我想让用户从我的 TypeScript NPM 包的子文件夹中导入。例如,如果TypeScript代码的目录结构如下,

- lib
- src
  - server
  - react
Run Code Online (Sandbox Code Playgroud)

我的包的用户应该能够从子文件夹导入package-name/reactpackage-name/server等等。

我的 tsconfig.json 如下。

{
    "compilerOptions": {
      "target": "es5",
      "module": "commonjs",
      "declaration": true,
      "outDir": "./lib",
      "strict": true,
      "jsx": "react",
      "esModuleInterop": true
    },
    "include": ["src"],
    "exclude": ["node_modules", "**/__tests__/*"]
  }
Run Code Online (Sandbox Code Playgroud)

当“outDir”设置为项目根目录时,我可以这样做,但是文件结构很混乱。有人可以指出我在保留的同时执行此操作的方法(从子模块导入)"outDir": "./lib"吗?非常感谢有用的答案。提前致谢。

bla*_*e20 10

这可以通过 package.json 文件中名为 的条目来实现exports

"exports": {
  "./server": "./lib/server",
  "./react": "./lib/react"
},
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读更多相关信息:https ://nodejs.org/api/packages.html#packages_package_entry_points

不过要小心:

警告:引入“exports”字段可防止包的使用者使用任何未定义的入口点,包括 package.json(例如 require('your-package/package.json')。这可能是一个重大更改。


编辑:似乎 TypeScript 忽略了该字段,也许当您添加如下类型时它会有所帮助:

// server.d.ts
export * from "./lib/server";

// react.d.ts
export * from "./lib/react";
Run Code Online (Sandbox Code Playgroud)

我做了什么

我复制了您的项目设置并更改了一些内容:

src/
  server.ts
  react.ts
lib/
  (generated output)
  server.d.ts
  server.js
  react.d.ts
  react.js
package.json
tsconfig.json
react.d.ts
server.d.ts
Run Code Online (Sandbox Code Playgroud)

将其添加到 package.json:

// server.d.ts
export * from "./lib/server";

// react.d.ts
export * from "./lib/react";
Run Code Online (Sandbox Code Playgroud)

反应.d.​​ts

export * from "./lib/react";
Run Code Online (Sandbox Code Playgroud)

服务器.d.ts

export * from "./lib/server";
Run Code Online (Sandbox Code Playgroud)

这对我有用。现在我可以在其他地方导入“mypackage/server”。也许您没有将定义文件拆分为多个文件,但尝试应用这些更改并查看它是否有效。