Angular: Importações erradas escritas por provedores que podem abalar a árvore no Bazel

Criado em 15 mai. 2018  ·  1Comentário  ·  Fonte: angular/angular

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

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:

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:

  • seria muito difícil para mim fazer isso, pois isso é uma mistura de código proprietário.
  • Acredito que você já conheça a causa, mas atualmente, compreensivelmente, não a priorize com base no pressuposto de que só acontece internamente na Angular.

>Todos os comentários

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:

  • seria muito difícil para mim fazer isso, pois isso é uma mistura de código proprietário.
  • Acredito que você já conheça a causa, mas atualmente, compreensivelmente, não a priorize com base no pressuposto de que só acontece internamente na Angular.
Esta página foi útil?
0 / 5 - 0 avaliações