如何为使用es20xx模块的库分发提供Webpack摇树



不幸的是,对于如何为库设置TypeScript编译器以便在依赖项目中未使用的模块将被Webpack切断的问题,没有有效的解决方案?(2021年9月)。Craig Hicks先生建议的解决方案只能在本地工作,不能用于可分发库(我将在下面解释细节)。

然而,从Hicks先生的回答中,我知道要使Webpack三摇可用,就需要将库作为ES模块分发。它为Node.js原生和ts-node的使用带来了问题,但我担心如果试图在一个问题中考虑所有这些问题,我会失望的。

目标库@yamato-daiwa/es-extensions有很多功能,即使在大型应用程序中,它的一部分也不会被使用。从理论上讲,Webpack的三次震动可以切断未使用的功能,但实际上它的工作有很大的局限性,正如下面的实验所示。

在下面的示例中,我希望只有isUndefined功能将被捆绑,而任何其他功能将不被捆绑:

import { isUndefined } from "@yamato-daiwa/es-extensions"
const test: string | undefined = "ALPHA";
console.log(isUndefined(test));
console.log("End of the script");

这是完整的存储库,复制自@yamato-daiwa/es-extensions@1.0.1-experimental2的本地副本(Library)。目录)和消费项目(ConsumingProject)目录)。

实验1:接近真实

在这个实验中,我将像往常一样安装库:

{
/* ... */
"dependencies": {
"@yamato-daiwa/es-extensions": "1.0.1-experimental2"
}
}

对于试验结果,我将在安装它们之前删除所有依赖项:

npm run "Clear dependencies and reinstall"

其中Clear dependencies and reinstall为:

"scripts": {
"Clear dependencies and reinstall": "(rm node_modules || del node_modules /F /Q) && npm i",
"Webpack:ProductionBuild": "webpack --mode production"
}

接下来,我将运行"Webpack:ProductionBuild"。在编译后的BrowserJS.js中,我们可以看到整个库已经被捆绑(缩小版本为1行和21579列):

(()=>{"use strict";function e(e){return null!==e}function t(e){return void 0!==e}function i(e,t){return void 0===e?t:e}
/* and so on ... */

这个实验可以在"experiment1-close_to_real"分支。

实验2:获取本地库

现在ConsumptingProject在本地引用Library:

"dependencies": {
"@yamato-daiwa/es-extensions": "../Library"
}

清理以前的node_modules并重新安装依赖项是很重要的:

npm run "Clear dependencies and reinstall"

,

npm run "Webpack:ProductionBuild"

输出BrowserJS.js与之前的实验一样,正好有21579列。

本实验可在experiment2-local_dependency分支中获得。

实验3:从本地Distributable目录

获取库现在库将从LibraryDistributable目录中获取:

"dependencies": {
"@yamato-daiwa/es-extensions": "../Library/Distributable"
}

这是Hicks先生建议的。

让我们清理之前的node_modules并重新安装依赖项:

npm run "Clear dependencies and reinstall"

如果我们执行"Webpack:ProductionBuild",未使用的功能最终将被切断:

(()=>{"use strict";console.log(!1),console.log("End of the script")})();

但是这个解决方案对已发布的库有什么影响呢?通常情况下,库将被安装为@yamato-daiwa/es-extensions,所以我和库用户需要三次震动的情况适用于这种情况。通过其他工作,我们需要在实验1中得到与第三个实验相同的结果。

这个实验在"experiment3-local_distributable"分支。

似乎声明"sideEffects": false是应用程序使用的每个包的责任,所以在应用程序的根目录package.json中设置它是不够的。

package.jsonof@yamato-daiwa/es-extensions需要包含"sideEffects": false,这样应用程序就知道没有副作用。我在你的第一个示例仓库中尝试了这一点,最终构建给了我预期的:

(()=>{"use strict";console.log(!1),console.log("End of the script")})();

相关内容

  • 没有找到相关文章

最新更新