从NPM包中导出多个模块

时间:2019-08-15 17:50:41

标签: node.js typescript npm yarnpkg yarn-workspaces

我有一个使用Node和Typescript的相当大的项目A。在项目A中,我有很多不同的模块,希望在另一个项目B中重用。

因此,我使用以下tsconfig.json构建了项目A:

name2

因此,所有文件都以这种方式内置到/ dist文件夹中:

  • dist
    • moduleA.js
    • moduleA.map
    • moduleA.d.ts
    • moduleB.js
    • moduleB.map
    • moduleB.d.ts
    • ....

要在另一个项目中使用这些moduleA和moduleB,请将以下内容添加到Project A中的package.json中:

   class mainViewController: UIViewController {
   //its inside a segment controller 
   @objc func Seg(sender: UISegmentedControl) {

    switch sender.selectedSegmentIndex {
    case 0:
   let firstViewController = SharedViewController()
        print(self.name1.text!)

        firstViewController.name2.text = self.name1.text!
        self.addChild(firstViewController)

        self.bottomContainer.addSubview(firstViewController.view)

        firstViewController.didMove(toParent: self)
  default: 
        let secondViewController = Shared2ViewController()
        self.addChild(secondViewController)
        self.bottomContainer.addSubview(secondViewController.view)
        secondViewController.didMove(toParent: self)
 }

我使用纱线工作区作为项目B中的程序包访问项目A。但是问题是,在新项目B中使用{ "compilerOptions": { "target": "es2017", "module": "commonjs", "declaration": true, "outDir": "./dist", "sourceMap": true, "strict": true, "noImplicitAny": true, "strictNullChecks": true, "typeRoots": ["./node_modules/@types", "./modules/@types"] }, "exclude": ["node_modules"] } 时,我只能访问模块A?那么如何从ProjectA访问更多模块?

2 个答案:

答案 0 :(得分:1)

将所有出口合并为一个index.ts会为您解决这个问题吗?

package.json(projectA):

{
  "main": "dist/index.js",
  "typings": "dist/index.d.ts",
  ...
}

index.ts(projectA):

// Adjust the relative import paths 
// and identifiers to your structure
export { ModuleA } from "./moduleA";
export { ModuleB } from "./moduleB";

projectB中的某些模块:

import {ModuleA, ModuleB} from 'projectA'

答案 1 :(得分:0)

我相信您正在寻找的是: https://nodejs.org/api/packages.html#packages_package_entry_points

目前尚不清楚 TypeScript 是否支持: https://github.com/microsoft/TypeScript/issues/33079

看起来你确实可以解决它,但在你的 package.json 中使用类似的东西:

{
    ...

    "main": "./dist/index.js",
    "types": "./dist/index.d.ts",
    "typesVersions": {
        "*": {
          "dist/index.d.ts": [ "dist/index.d.ts" ],
          "*": [ "dist/*" ]
        }
      },
    "exports": {
        ".": "./dist/index.js",
        "./": "./dist/"
    },

    ...
}