为何仅首个/*!注释在编译后的JavaScript中保留,其余丢失?
TypeScript编译仅保留首个
/*!注释的原因及解决方法 你遇到的这个问题其实是TypeScript编译器的默认行为——默认情况下,tsc只会保留文件顶部的第一个/*!注释,后续的同格式注释会被当作普通块注释处理并移除。
为什么会这样?
TypeScript将文件开头的/*!注释认定为版权/许可证类注释,这类注释通常只会在文件顶部出现一次,所以编译器默认只保留这一个,其余的同格式注释就会被清理掉。
解决办法
给你两个可行的方案,根据你的需求选择:
方案1:关闭所有注释移除
如果希望保留所有注释(包括/*!、普通块注释和行注释),可以在编译时添加--removeComments false参数,或者在tsconfig.json中配置:
{ "compilerOptions": { "removeComments": false } }
对应的编译命令改为:
./node_modules/.bin/tsc tsfile.ts --removeComments false
这个方案的缺点是会保留所有注释,如果你只想保留特定的/*!注释,可能不太合适。
方案2:用@preserve标记需要保留的注释
如果你只想保留特定的/*!注释(其他普通注释仍可移除),可以在目标注释里添加@preserve指令,编译器就会保留这个注释,不管它在文件的哪个位置。
修改你代码里的最后一个注释:
/*! * Another comment that should be preserved! * @preserve */
这样编译后的JavaScript文件中,不仅会保留顶部的第一个/*!注释,这个带@preserve的注释也会被保留下来。
验证效果
以你的代码为例,修改后编译出的JS文件会包含:
/*! * tsfile.ts * - a demonstrative typescript file * - to compile: `./node_modules/.bin/tsc tsfile.ts` * * Copyright © Grateful | Fri Oct 09 */ // Number let num = 0.444; let hex = 0xbeef; let bin = 0b0010; // Number let num2 = 0.444; let hex2 = 0xbeef; let bin2 = 0b0010; /*! * Another comment that should be preserved! * @preserve */ // Number let num3 = 0.444; let hex3 = 0xbeef; let bin3 = 0b0010; // 1. any // 2. built-in ie number, string, boolean, undefined, null, void, etc // 3. user-defined ie array, enum, array, class, interface, and tuple // Number let num4 = 0.444; let hex4 = 0xbeef; let bin4 = 0b0010;
(如果使用默认的removeComments: true,普通的/* */块注释会被移除,但带@preserve的/*!注释会保留)
内容的提问来源于stack exchange,提问作者Grateful
相关产品推荐
相关产品推荐

