Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以两种样式发布NPM模块_Npm_Webpack_Umd - Fatal编程技术网

以两种样式发布NPM模块

以两种样式发布NPM模块,npm,webpack,umd,Npm,Webpack,Umd,我有一个包,它通过Typescript编译成UMD,然后通过Webpack转换成全局变量(我们必须使用Typescript,所以更灵活的UMD模式不是一个选项)。我希望使用包的应用程序能够选择它们需要的。这些将部署到本地NPM注册表 目前,我有一个package.json,它列出了所有必需的依赖项和构建脚本。我不介意发布两个不同的包(可能是不同的范围,即@my umd packages\my packages和@my globals packages\mypackages),但我想为所有依赖项和

我有一个包,它通过Typescript编译成UMD,然后通过Webpack转换成全局变量(我们必须使用Typescript,所以更灵活的UMD模式不是一个选项)。我希望使用包的应用程序能够选择它们需要的。这些将部署到本地NPM注册表

目前,我有一个package.json,它列出了所有必需的依赖项和构建脚本。我不介意发布两个不同的包(可能是不同的范围,即
@my umd packages\my packages
@my globals packages\mypackages
),但我想为所有依赖项和脚本保留一个包,因为除了最后一步之外,它们都是一样的

最整洁的方法是什么?一个包可以在两个地方发布,并且具有不同的
main
属性吗


感谢您的帮助

TypeScript不会回退到全局变量,全局变量应该是UMD模块的一部分。有可能发布多个版本的软件包。坦率地说,为全局变量提供一个单独的模块是相当特别的,因为UMD大部分时间都使用该部分。好消息是webpack确实支持这种模块,将能够产生它的设置

许多软件包发布多个版本,例如一个带有ES模块,用于webpack或Rollup等模块绑定器,另一个在Node中工作(带有
require
)。一个很好的例子是Redux,它有一个。它使用Babel来传输源代码并对包进行汇总,但对TypeScript和webpack的原理是相同的

Redux发布三个目录(有关完整的发布结构,请参阅):

dist/#UMD捆绑包
es/#es模块版本(与lib/相同,但带有es模块)
lib/#传输版本以在节点中工作
这意味着您可以导入
redux/dist/redux.js
,如果您想使用UMD版本,例如在脚本标记中,这非常简单,这要感谢unpkg(希望这是globals的主要用途)



此外,它还定义绑定器将使用哪些绑定器,这些绑定器将受益于ES模块(有关详细信息),否则它将使用
lib/index.js
main
字段)使用WebPACK,您可以配置要使用的字段。您可能需要考虑发布这样的结构,因为如果您只想使用WebPACK中启用的部分和ES模块,那么导入整个包并不总是必要的,WebPACK组件将使您的库的用户增值,因为它将减少束SIZ。e、

为什么会有一个带有全局变量的版本和一个带有UMD的版本?UMD可以追溯到一个全局变量,这是通用模块定义的一个关键部分。@MichaelJungo-不是一个类型脚本UMD。这里有关于问题的讨论和一些解决方法。好的,我在中看到了讨论,它不应该被称为UMD,但他们最终做了不管怎么说,我还是不知道它。很高兴知道
resolve.mainFields
存在,并且在一个包中支持多个模块模式。但是如果没有扩展到Typescript的这种支持,当我在另一个Typescript文件中使用不在
index.ts
index.d.ts
中的模式时,我只会得到一个编译错误。Nothing阻止您同时发布TypeScript源代码,您需要做的就是在webpack中使用TypeScript加载程序。但您可以从TypeScript导入JavaScript,这不是问题。要获得类型定义,您可以发布它们并使用
typings
字段引用它们,许多软件包都会这样做(甚至有些不是用TypeScript编写的,例如。)TypeScript源代码只描述有限的UMD(仅限CommonJS和AMD)自动生成的
index.d.ts
也会反映这一点。我可以手动创建一个
d.ts
文件,其中包括
导出为命名空间myModule
之类的内容,它会反映生成的网页包/汇总。但是如果所有内容都在一个包中,Typescript如何知道使用哪个?我可以使用re相对导入语句(即,
import*作为myModule从“../../../node\u modules/my module/globals/index”
导入,但这有一些明显的缺陷。键入描述了整个公共API,而不管模块是如何分布的。因此,即使在一些ituations(当您使用UMD时)名称空间不存在吗?
output: {
  filename: 'mylib.js',
  library: 'MyLibrary',
  libraryTarget: 'umd'
}
<script src="https://unpkg.com/redux/dist/redux.js"></script>