使用 tsc --build
,我们观察输入文件、配置文件和输出文件的时间戳,以确定是否需要重建。在过去,我们从未检查模块解析及相关文件及其时间戳,要求用户在所有输入和输出都是最新的且仅对模块解析相关的更改时强制构建。例如,node_modules/@types/someType/packge.json
表示导出或导入Map或类型条目发生了变化。
最近,为了适应 nodenext 解析更改,我们将 package.json 也作为要检查时间戳的文件列表的一部分添加了进来。但是,由于在没有程序构造的情况下无法推导出来,这意味着我们只有在构造程序时才监视/检查它们的时间戳。这意味着我们只在 watch 场景中受益于此,而且如果程序被构造的话。
所以这里有两个问题:
- 我们真的需要监视/时间戳检查
package.json
吗?因为现在它可能会改变影响模块解析的字段。 - 如果我们需要处理
package.json
,我们可以使用启发式方法还是需要这些字段?请注意,我们可以将此列表存储在 buildinfo 中,但这样非增量程序也会面临相同的问题,因为它们没有可读的 buildinfo?
package.json 检测选项:
a. package.json 位于您自己的 tsconfig 旁边,以及引用部分中的任何配置?
b. @RyanCavanaugh 建议在 tsconfig 中包含 packagejson 条目
c. references 部分允许 packge.json
,但我们是否允许在 package.json 中包含 tsconfig 选项?
- 最初由 @sheetalkamat 在 #44935(评论)中发布*
4条答案
按热度按时间ryoqjall1#
CC @weswigham
wvyml7n52#
是的,我们肯定希望解决这个问题;不幸的是,构建模式的操作方式并不适合轻松地实现这个功能,而不需要完全执行构建模式原本打算避免的操作——解析每个文件中的(非相对)指定符并解决它们。从程序缓存中提取现有数据的逻辑对于非初始构建来说可能是一个有价值的优化,即使我们能找到一种方法来获取初始构建的列表。
2vuwiymt3#
但是这似乎是一种不太一致的经验。
如果我真的做了
行为与
文件监视器通常进行轮询,因此它们与它们相关联的成本更高。
如果这是情况的话,只更改package.json和目录更新(例如npm install替换文件)的概率是多少?可能目录监视器更好,这就是我们用于失败查找的方式。
话虽如此,我强烈认为,ts构建应该监视那些可以通过配置文件或一些可以观察到的启发式文件来推导出来的东西,无论是否创建程序。
vwhgwdsa4#
文件监视器通常采用轮询方式,因此它们与它们相关的成本更高。
如果是这样,仅更改package.json文件与目录更新(如npm install替换文件)的概率是多少?可能目录监视器更好,这就是我们用于失败查找的方式。
所以在单仓库设置(如果我没记错的话,这是构建模式的主要用例)中,只有包文件发生变化而不改变整个目录结构是非常常见的(我想这和人们重构他们的文件结构或包一样常见)。包文件本质上是简化的源文件——它们实际上有导入,人们可以根据自己的喜好随意更改它们(随着现代包文件功能的增加,这种更改的频率也在不断增加)。除此之外,大多数node_modules文件夹通常只安装一次并完成,很少更新。
难道我们不应该尽可能地使用目录监视器吗?我想如果主机支持的话,我们在最根位置的一个单独的目录监视器是我们已经尝试过的方法,然后对其进行过滤。不过我不太熟悉各种文件监视策略的性能特性。
话虽如此,我坚信ts构建应该监视那些可以通过配置文件或一些可以观察到的启发式文件得出的东西。
我认为在递归目录结构中监视所有可能的包文件路径肯定是一个选项(我想使用目录监视器会很容易且便宜)。当然,在没有程序数据的情况下可以推导出来,然后在程序创建过程中实际使用的包可以在监视模式下将相关位置缩小到更小的范围。