Los proveedores modificables activan el compilador Angular para introducir declaraciones de importación en el código del usuario, lo que no hicimos antes. Resulta que tenemos lugares donde combinamos las rutas de los módulos en el disco con los nombres de los módulos (las versiones anteriores del compilador no tenían esta distinción)
Así que terminamos escribiendo importaciones como import {} from 'wksp/packages/path/to/thing'
que deberían haber sido import {} from '@pkg_name/path/to/thing'
Hasta donde sabemos, este problema solo afecta a los usuarios de Bazel que compilan con ngc
y usan proveedores que se pueden cambiar de árbol. Hasta ahora, solo hemos visto este problema internamente en Angular.
Esto se encontró como parte de # 20030
Para reproducir, agregue un proveedor que se pueda sacudir, por ejemplo, pegue en 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 {}
luego construye el paquete npm
bazel build //packages/common:npm_package
Y busque la cadena angular/packages
en la salida:
$ export bin=$(bazel info bazel-bin)
$ find $bin -type f -exec fgrep -l angular/packages {} \; | grep -v ngsummary | grep -v ngfactory
eliminamos los archivos ngsummary porque siempre han tenido rutas en el disco como identificadores de módulo.
Los archivos ngfactory no se envían con el paquete, por lo que probablemente también sean inofensivos.
Curiosamente, encontramos la mala importación en la salida de 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"; // <-------------------------
pero no en la salida 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");
Ahora también nos encontramos con este problema.
Llamamos a la API del compilador internamente en un repositorio mono, esto nos resulta internamente también en rutas de importación como:
import * as i1 from "@our-group/our-package/src/some-service";
Sin embargo, esto nos sucede en la salida de ES5, pero supongo que la causa raíz es similar.
Soluciones alternativas para nosotros es definir la fábrica nosotros mismos en el @Injectable. Eso evita que angular genere la fábrica y, por lo tanto, genere la importación defectuosa.
No estoy seguro de si necesito proporcionar más información / reproducible:
Comentario más útil
Ahora también nos encontramos con este problema.
Llamamos a la API del compilador internamente en un repositorio mono, esto nos resulta internamente también en rutas de importación como:
Sin embargo, esto nos sucede en la salida de ES5, pero supongo que la causa raíz es similar.
Soluciones alternativas para nosotros es definir la fábrica nosotros mismos en el @Injectable. Eso evita que angular genere la fábrica y, por lo tanto, genere la importación defectuosa.
No estoy seguro de si necesito proporcionar más información / reproducible: