Provedores que podem ser alterados acionam o compilador Angular para introduzir instruções de importação no código do usuário, o que não havíamos feito antes. Acontece que temos lugares onde combinamos caminhos de módulo no disco com nomes de módulo (versões anteriores do compilador não tinham essa distinção)
Então acabamos escrevendo importações como import {} from 'wksp/packages/path/to/thing'
que deveriam ter sido import {} from '@pkg_name/path/to/thing'
Até onde sabemos, esse problema afeta apenas os usuários do Bazel que compilam com ngc
e usam provedores que podem ser abalados por árvores. Até agora, vimos esse problema apenas internamente no Angular.
Isso foi encontrado como parte de # 20030
Para reproduzir, adicione um provedor que pode ser abalado por árvores, por exemplo, cole em packages/common/src/common_module.ts
import {Injectable, PLATFORM_ID} from '@angular/core';
import {DOCUMENT, isPlatformBrowser} from '@angular/common';
export function viewportScrollerFactory(platformId: string, document: any) {
return isPlatformBrowser(platformId) ? null: null;
}
@Injectable(
{providedIn: 'root', useFactory: viewportScrollerFactory, deps: [PLATFORM_ID, DOCUMENT]})
export abstract class ViewportScroller {}
em seguida, construa o pacote npm
bazel build //packages/common:npm_package
E procure a string angular/packages
na saída:
$ export bin=$(bazel info bazel-bin)
$ find $bin -type f -exec fgrep -l angular/packages {} \; | grep -v ngsummary | grep -v ngfactory
removemos arquivos de resumo porque eles sempre tiveram caminhos no disco como identificadores de módulo.
Os arquivos ngfactory não são enviados com o pacote, portanto, provavelmente também são inofensivos.
Curiosamente, encontramos a má importação na saída ES2015:
bin/packages/common/src/common_module.closure.js
/**
* <strong i="28">@fileoverview</strong> added by tsickle
* <strong i="29">@suppress</strong> {checkTypes} checked by tsc
*/
/**
* <strong i="30">@license</strong>
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { NgModule } from '@angular/core';
import { COMMON_DIRECTIVES } from './directives/index';
import { DEPRECATED_PLURAL_FN, NgLocaleLocalization, NgLocalization, getPluralCase } from './i18n/localization';
import { COMMON_DEPRECATED_I18N_PIPES } from './pipes/deprecated/index';
import { COMMON_PIPES } from './pipes/index';
import { Injectable, PLATFORM_ID } from '@angular/core';
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/core/src/application_tokens";
import * as i2 from "angular/packages/common/src/dom_tokens"; // <-------------------------
mas não na saída ES5
bin/packages/common/src/common_module.js
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define("@angular/common/src/common_module", ["require", "exports", "tslib", "@angular/core", "@angular/common/src/directives/index", "@angular/common/src/i18n/localization", "@angular/common/src/pipes/deprecated/index", "@angular/common/src/pipes/index", "@angular/core", "@angular/common", "@angular/core", "@angular/core/src/application_tokens", "@angular/common/src/dom_tokens"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var core_1 = require("@angular/core");
var index_1 = require("@angular/common/src/directives/index");
var localization_1 = require("@angular/common/src/i18n/localization");
var index_2 = require("@angular/common/src/pipes/deprecated/index");
var index_3 = require("@angular/common/src/pipes/index");
var core_2 = require("@angular/core");
var common_1 = require("@angular/common");
var i0 = require("@angular/core");
var i1 = require("@angular/core/src/application_tokens");
var i2 = require("@angular/common/src/dom_tokens");
Também estamos enfrentando esse problema.
Chamamos as APIs do compilador internamente em um mono-repo, o que resulta para nós internamente também em caminhos de importação como:
import * as i1 from "@our-group/our-package/src/some-service";
No entanto, isso acontece para nós na saída ES5, mas presumo que a causa raiz seja semelhante.
Soluções alternativas para nós é definirmos nós mesmos a fábrica no @Injectable. Isso impede o Angulo de gerar a fábrica e, assim, gerar a importação defeituosa.
Não tenho certeza se preciso fornecer mais informações / reproduzíveis:
Comentários muito úteis
Também estamos enfrentando esse problema.
Chamamos as APIs do compilador internamente em um mono-repo, o que resulta para nós internamente também em caminhos de importação como:
No entanto, isso acontece para nós na saída ES5, mas presumo que a causa raiz seja semelhante.
Soluções alternativas para nós é definirmos nós mesmos a fábrica no @Injectable. Isso impede o Angulo de gerar a fábrica e, assim, gerar a importação defeituosa.
Não tenho certeza se preciso fornecer mais informações / reproduzíveis: