TypeScript 不会回退到全局变量,它应该是 UMD 模块的一部分。有可能发布您的包的多个版本。坦率地说,为全局变量提供一个单独的模块是相当特别的,因为大多数时候 UMD 都参与其中。好消息是 webpack 确实支持这种模块,并且可以通过设置output.libraryTarget
.
output: {
filename: 'mylib.js',
library: 'MyLibrary',
libraryTarget: 'umd'
}
许多包发布了多个版本,例如,一个带有用于 webpack 或 Rollup 等模块捆绑器的 ES 模块,另一个在 Node 中工作(带有require
)。这样做的一个很好的例子是 Redux,它有一个简单的构建步骤。它使用 Babel 为 bundle 转译 source 和 Rollup,但 TypeScript 和 webpack 的原理是相同的。
Redux 发布了三个目录(参见unpkg - Redux了解完整的发布结构):
dist/ # UMD bundles
es/ # ES modules version (same as lib/ but with ES modules)
lib/ # Transpiled version to work in Node
这意味着如果您想使用 UMD 版本,您可以导入redux/dist/redux.js
,例如在脚本标签中,这非常简单,这要归功于 unpkg(希望这是全局变量的主要用途)。
<script src="https://unpkg.com/redux/dist/redux.js"></script>
此外,它定义了module
捆绑器将使用的字段,这些字段受益于 ES 模块(汇总 -pkg.module
了解详细信息),否则它将使用lib/index.js
(main
字段)。使用 webpack,您可以配置要使用的字段resolve.mainFields
。您可能需要考虑发布这样的结构,因为如果您只想使用其中的一部分并且 ES 模块在 Webpack 中启用Tree Shaking ,则不必总是需要导入整个包,您的库的使用者会喜欢它,因为它会减小包大小。