不幸的是,对于如何为库设置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
目录
获取库现在库将从Library
的Distributable
目录中获取:
"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")})();