Angular 5.2无法使用aot和i18n构建应用程序,得到错误:无法读取属性'范围'为null

时间:2018-01-31 21:42:36

标签: angular webpack angular-cli

使用Internationalization(i18n)和AOT编译器构建应用程序时发生错误。使用JIT compiller我的应用程序构建良好。

请不要建议我使用ng build --aot=false。这是一个肮脏的解决方案,我需要一个性能和更少的捆绑包。

要重现错误:创建新项目,将内容添加到app.component.html:

<h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1>

使用命令创建翻译:

ng xi18n --outputPath src/locale --outFile messages.ru.xlf

在标记&lt; target&gt;&lt; / target&gt;中添加翻译文本。 并使用命令构建应用程序:

ng build --aot --prod --i18n-file=src/locale/messages.ru.xlf --i18n-format=xlf --locale=ru

错误文本将是:

  

块主要错误[初始] [名称]。[chunkhash:20] .bundle.js不能   阅读财产&#39;范围&#39; null TypeError:无法读取属性&#39; range&#39;   为null       在enterNode(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:146:14)       在getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:125:24)       at getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:134:24)       在enterNode(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:149:18)       在getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:138:25)       在enterNode(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:149:18)       在getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:125:24)       at getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:134:24)       在enterNode(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:149:18)       在getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:125:24)       at getPathInAst(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:134:24)       在info.moduleScope.variables.forEach.variable(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:536:23)       at Array.forEach(native)       在modulesWithInfo.forEach.info(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:524:34)       at Array.forEach(native)       在ConcatenatedModule.source(C:\ Users \ admin \ Desktop \ angular-test \ my-app \ node_modules \ webpack \ lib \ optimize \ ConcatenatedModule.js:516:19)

2 个答案:

答案 0 :(得分:1)

我找到了如何关闭此错误,但我不知道导致此错误的原因。如果知道webpack,请告诉我错误的来源。简而言之,我的解决方案如下:

在文件my-app\node_modules\webpack\lib\optimize\ConcatenatedModule.js:146中添加代码:

    if (n === null)
        return undefined;

总代码必须是这样的:

function enterNode(n) {
    if (n === null)
        return undefined;

    const r = n.range;
    if(r) {
        if(r[0] <= nr[0] && r[1] >= nr[1]) {
            const path = getPathInAst(n, node);
            if(path) {
                path.push(n);
                return path;
            }
        }
    }
    return undefined;
}

答案 1 :(得分:1)

尝试

ng build --prod -vc=true

或只是-vc,因为true是--prod

的默认值

vc是供应商块的别名,意味着使用仅包含供应商库的单独包。 出于某种原因,在此版本的angular cli中默认情况下它无法正常工作