【问题标题】:npm module with TypeScript带有 TypeScript 的 npm 模块
【发布时间】:2020-01-06 01:09:52
【问题描述】:

我正在用 TypeScript 编写一个 npm 模块。假设我的图书馆中有这棵树:

.
├── README.md
├── dist
│   ├── index.d.ts
│   └── index.js
├── lib
│   └── index.ts
├── package-lock.json
├── package.json
├── test
│   └── test.js
└── tsconfig.json

在我的package.json 我有这个:

{
    "name": "mylib",
    "version": "1.0.1",
    "description": "A Node.js module",
    "main": "dist/index.js",
    "types": "dist/index.d.ts",
    "scripts": {
        "build": "tsc"
    },
    "devDependencies": {
        "typescript": "^2.5.3"
    }
}

在 tsconfig.json 中——默认配置——我有:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "declaration": true,
        "outDir": "./dist",
        "strict": true
    }
}

dist/index.ts 我有:

export function appendtext(str: string): string {
    return str + ' world';
}

我把这个库称为:

var mylib = require('mylib');
var result = mylib.appendtext('Hello');

问题1:当我从我的应用程序myapp 调用mylib 时,myapp 不会构建它;它只会使用dist/ 处的编译代码。这是正确的吗?

问题2:如果1正确,那么我可以将lib/index.ts的源代码拆分成不同的模块,在开发mylib的时候用WebPack编译。生成的代码将保存在dist/,这是myapp 将使用的代码。所以,myapp 不需要编译mylib 的模块,因为它会使用dist/ 已经链接的代码。

感谢您的澄清!

【问题讨论】:

  • 当你使用 ts 和 node..通常 import * as something from 'something';..也在你的 package.json 中:你可以试试 "scripts": { "build": "tsc -w" }
  • 你还需要显示你的tsconfig.json是什么@
  • 您好,谢谢!添加了基本的 tsconfig.json 信息。

标签: javascript node.js typescript npm webpack


【解决方案1】:

问题 1:是的,只会运行来自 dist/ 的构建代码。

问题 2:是的,您可以将 index.ts 拆分为多个文件或模块。一般来说,你可能不想在这个级别使用 webpack - 在大多数情况下,最好留给最终的最终应用程序。这是不必要的(最终应用程序通常会使用 webpack 或类似的东西),并且会因为更难找到正在执行的“真实”代码而使调试等变得更加复杂。

相反,您可以拆分为多个文件,仍然只使用 tsc,它们将全部dist/ 结尾,通过内部 require() 调用链接在一起,就像任何普通节点模块一样,并且那会很好用。或者,如果您需要拆分成完全独立的模块,只需分别对每个模块遵循相同的模式,这样它们都会导出 JavaScript 文件 + 类型,您可以从下一个模块照常导入它们。

【讨论】:

  • 嗨@TimPerry,非常感谢。在2. 中,您说 Webpack 没有必要(最终应用程序通常会使用 webpack 或类似的东西)。但是我们假设最终应用程序将使用 WebPack 之类的链接器/编译器。如果myapp不用怎么办?
  • 这取决于环境(网络、节点、...其他?),以及您为什么不使用捆绑。如果你正在为 web 构建任何实质性的东西,你真的需要捆绑,无论是为了性能,还是因为你需要它来处理几乎所有的 npm 依赖项。同时在 node 中,这些 commonjs 模块将开箱即用,无需捆绑。什么情况,为什么不捆绑myapp
  • 顺便提一下,一个有趣的选择是 ES 模块,它现在得到了广泛的原生支持,它为您提供了 Web 上的模块而无需捆绑。对于这种情况,您可以让 TypeScript 直接输出 CommonJS 和 ESM。有关示例,请参阅 github.com/httptoolkit/react-reverse-portal(和结果请参阅 unpkg.com/react-reverse-portal)。
  • 感谢您的回答。想想看,确实,任何可能使用这个库的应用程序都需要一个捆绑器。 ES 模块是一种替代方案,但只有使用 TypeScript,我才能将代码编译为 Javascript,并将链接留给应用程序的捆绑程序。
猜你喜欢
  • 2015-11-20
  • 2016-02-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2016-08-02
  • 2016-07-18
  • 2016-10-05
  • 2015-09-04
相关资源
最近更新 更多