我想在我的Angular2应用程序上某个地方有一个时间戳或内部版本号,这样我就可以知道用户是否在使用旧的缓存版本.

如何在AOT编译/构建时使用Angular2中的AngularCLI实现这一点?

推荐答案

  1. 安装plugin npm install replace-in-file --save-dev
  2. 添加到生产环境src/Environment/Environment.prod.ts新 属性

    export const environment = {
        production: true,
        version: '{BUILD_VERSION}'
    }
    
  3. 将生成文件replace.build.js添加到文件夹的根目录

    var replace = require('replace-in-file');
    var buildVersion = process.argv[2];
    const options = {
        files: 'src/environments/environment.prod.ts',
        from: /{BUILD_VERSION}/g,
        to: buildVersion,
        allowEmptyPaths: false,
    };
    
    try {
        let changedFiles = replace.sync(options);
        console.log('Build version set: ' + buildVersion);
    }
    catch (error) {
        console.error('Error occurred:', error);
    }
    
  4. 将脚本添加到Package.json

    "updateBuild": "node ./replace.build.js"
    
  5. 在应用程序中使用environment.version

  6. 在构建前呼叫npm run updateBuild -- 1.0.1

PS.您必须始终记住,{BUILD_VERSION}从未提交.

PS.我在my blog中写了一个更好的解决方案

PS.3如@julien-100000所述,您不应提交环境.更新版本的prod.ts.版本更新只能在生成过程中进行.而且永远不应该被promise .

Angular相关问答推荐

文件阅读器未正确给出某些CSV文件的结果

使用当前选定的选项创建IF语句

仅在从forkJoin获得数据后订阅主题

未在ng bootstrap 模式中设置表单输入

截获火灾前调用公共接口

Angular 应用程序未在Azure应用程序服务中运行

阶段JS画布覆盖 bootstrap 模式

Angular:为什么在 ngAfterContentInit 之后变量未定义?

BehaviorSubject 在 Angular 中制作数据之间的时间表(或计时器)

等待两个订阅完成而不嵌套

将 injectiontoken 用于 Angular 中的模块特定设置

Angular2 测试 - 按 ID 获取元素

如何将新的 FormGroup 或 FormControl 添加到表单

无法绑定到matDatepicker,因为它不是 input的已知属性

如何在Angular 4中为数字管道指定语言环境千位分隔符

ConnectionBackend 没有提供程序

NG 测试中的调试测试

Angular 2 组件不是任何 NgModule 的一部分

如何以编程方式触发`valueChanges`?

Firestore 从集合中获取文档 ID