更新线上服务器时能否仅编译部署单个Angular TypeScript文件
结论
不可以直接将本地修改的单个TypeScript源文件部署到线上生产环境,这种操作100%会导致服务运行异常。
核心原因
Angular生产环境运行的并不是开发者编写的.ts源文件:
- 你写的TypeScript带类型注解、Angular装饰器、高版本ES语法,浏览器本身无法直接识别运行,必须经过完整的AOT编译、语法转译、Tree Shaking摇树优化、代码压缩混淆、模块合并拆分等构建流程,最终生成
dist目录下的静态JS/CSS资源才能被服务器托管运行。 - 生产构建时,所有业务代码会被按规则打散拼接进不同的bundle包,哪怕你只修改了一行TS代码,最终生成的多个bundle文件的内容、文件哈希都会发生变化,根本不存在和你修改的TS文件一一对应的线上文件可供替换。
- 只有本地执行
ng serve启动的开发调试模式才会实时在线编译TS文件,但这种模式没有任何性能优化、携带调试信息、内存占用极高,绝对不能用于生产环境对外提供服务。
想要降低部署故障风险的正确操作
不要尝试跳过构建流程直接传源文件,你可以按照下面的流程操作,把全量部署的风险降到几乎为0:
- 本地先执行完整生产构建命令
ng build --configuration production,在本地用静态服务托管构建出的dist目录,全流程验证修改点功能正常、没有控制台报错、核心路径交互无异常,从根源上避免把有问题的代码发到线上。 - 部署前先把线上当前正在运行的全量静态资源打压缩包备份,一旦新版本部署后出现异常,10秒内就能切回备份版本完成回滚,不会造成长时间服务中断。
- 如果后续需要频繁小范围更新,可以提前把项目改造成模块联邦微前端架构,将经常迭代的业务模块拆分为独立的远程模块,后续更新时只需要重新构建、部署对应模块的独立产物,不需要重新部署整个主应用,但这依然是部署构建后的静态资源,不是直接上传TS源文件。
不要尝试在线上服务器装依赖、直接拉源码执行在线编译的方案:线上环境和本地的依赖版本、环境变量、系统权限很容易存在差异,会导致构建产物和本地验证的版本不一致,出问题的排查难度远高于正常的本地构建+全量部署流程。
内容的提问来源于stack exchange,提问作者Henry Oladeji
相关产品推荐
相关产品推荐

