Angular: Importaciones incorrectas escritas por proveedores inestables bajo Bazel

Creado en 15 may. 2018  ·  1Comentario  ·  Fuente: angular/angular

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");
P3 bazel low bufix

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:

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:

  • Sería muy difícil para mí hacerlo, ya que se trata de una combinación de código propietario.
  • Creo que ya conoce la causa, pero actualmente, comprensiblemente, no la priorice basándose en la suposición de que solo ocurre internamente en Angular.

>Todos los comentarios

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:

  • Sería muy difícil para mí hacerlo, ya que se trata de una combinación de código propietario.
  • Creo que ya conoce la causa, pero actualmente, comprensiblemente, no la priorice basándose en la suposición de que solo ocurre internamente en Angular.
¿Fue útil esta página
0 / 5 - 0 calificaciones