JavaScript npm包应该缩小吗?
我已经创建了,但我仍然不知道这个问题的正确答案:“JavaScript npm包应该缩小吗?” 我一直明白缩小缩小代码是个坏主意,所以在我的npm包中没有这样做。然而,我看到一些npm软件包提供了其“dist”文件的缩小版本以及未统一的版本,而不是JavaScript npm包应该缩小吗?,javascript,node.js,npm,Javascript,Node.js,Npm,我已经创建了,但我仍然不知道这个问题的正确答案:“JavaScript npm包应该缩小吗?” 我一直明白缩小缩小代码是个坏主意,所以在我的npm包中没有这样做。然而,我看到一些npm软件包提供了其“dist”文件的缩小版本以及未统一的版本,而不是 哪一个是对的?谁会使用缩小版?这取决于您的软件包消费者的环境 NodeJS 对于NodeJS用户,您的包不必缩小,因为节点运行时通常可以直接访问node\u modules文件夹。不需要网络传输,并且在运行代码之前不执行额外的代码转换 捆绑机/建
哪一个是对的?谁会使用缩小版?这取决于您的软件包消费者的环境
NodeJS 对于NodeJS用户,您的包不必缩小,因为节点运行时通常可以直接访问
node\u modules
文件夹。不需要网络传输,并且在运行代码之前不执行额外的代码转换
捆绑机/建造管道 对于在构建管道中使用捆绑程序的开发环境,最好不要缩小包。在大多数情况下,包使用者在构建过程中实现了自己的缩小过程。此外,以模块格式提供软件包时,例如:
- 可以更准确地分析实现代码基的依赖树,这可能会导致更好的树抖动性能李>
- 对于所有这样的包(模块是“单例”),包之间的公共依赖关系实际上是相同的符号。这有助于代码拆分以及保持捆绑包较小李>
如果您决定不提供缩小的代码,仍然建议您运行自己的测试,以查看标准缩小过程(例如使用UglifyJS)是否不会破坏软件 尽管对于许多消费者来说,没有必要缩小您的代码,但除了常规发行版之外,还建议提供一个缩小的捆绑包,以防有人从中受益 对于Angular、Vue、Ember等框架的插件/扩展,通常不需要缩小代码,因为它们都实现自己的构建管道,通常通过cli实现
脚本标记/CDN 这些都是小型化的主要目标。如果您在CDN上托管一个文件,或者通过web提供该文件以供直接
标记使用,那么您看到的就是您得到的。在这两种情况下,文件都必须通过网络传输。缩小可以节省字节
缩小与透明 这两者之间有一个非常重要的区别。尽管缩小并非总是必要的,但通常您有责任传输任何不可能与包受众的目标环境100%兼容的代码。这包括:
- 将新的
语法传输到-maybly-ES5ES20XX
- Polyfilling任意
API实现ES20XX
缩小和捆绑 如果您的软件包由一个单个捆绑包而不是一堆单独的模块组成,那么缩小规模始终是一个安全的选择。因为绑定器永远不会尝试任何与单个模块/实体有关的有趣的事情(比如树抖动),所以很可能您的代码在技术上不会因任何构建过程而发生任何更改
调试
如果您打算分发一个小型软件包,最好同时提供一个非小型软件包用于调试目的。我认为这取决于意见,因为没有“正确”的答案(并因此投票决定关闭)-但如果我发布软件包,我会让这两个版本都可用。。。缩小是为了提高性能,而非缩小是为了可调试性。缩小Javascript通常是为了在连接速度较慢的web浏览器上获得好处。由于node.js通常在服务器上运行,并且文件保存在服务器上,因此在执行脚本时,您没有下载脚本。@Barmar也许我应该更明确地指出,在大多数情况下(我可能错误地概括了这一点),开发人员无论如何都会捆绑和缩小他们的所有代码,那么是否真的需要在包级别缩小?如果缩小,那么通过cdn从浏览器使用包非常容易,例如
,这个问题应该重新打开。正如投票率最高的答案所显示的那样,可以提出许多客观和有用的观点,帮助人们更好地决定是否缩小规模。关闭这样一个“基于意见”的问题毫无意义。它是否与我们必须在库的package.json
中指定的JS文件有关?您会分别为main
和module
字段选择哪个文件?例如,如果我使用Webpack作为我的库的绑定器:“main”:“library.js的dist/non-minified umd版本”
(库的非minified umd版本,在.gitignore
中有dist/
目录,用户将必须运行npm run build
来生成dist/non-minified umd版本的library.js
)和“模块”:“src/es6模块版本的library.js”
(直接es6源入口点)?对的