Angular: Importations erronées écrites par des fournisseurs tree-shaquables sous Bazel

Créé le 15 mai 2018  ·  1Commentaire  ·  Source: angular/angular

Les fournisseurs arborescents déclenchent le compilateur Angular pour introduire des instructions d'importation dans le code de l'utilisateur, ce que nous ne faisions pas auparavant. Il s'avère que nous avons des endroits où nous confondons les chemins de modules sur le disque avec les noms de modules (les versions antérieures du compilateur n'avaient pas cette distinction)
Nous finissons donc par écrire des importations comme import {} from 'wksp/packages/path/to/thing' qui auraient dû être import {} from '@pkg_name/path/to/thing'

Pour autant que nous le sachions, ce problème n'affecte que les utilisateurs de Bazel qui compilent avec ngc et utilisent des fournisseurs pouvant être modifiés par arbre. Jusqu'à présent, nous n'avons vu ce problème qu'en interne dans Angular.

Ceci a été trouvé dans le cadre de #20030

Pour reproduire, ajoutez un fournisseur arborescent, par exemple coller dans 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 {}

puis construisez le paquet npm

bazel build //packages/common:npm_package

Et recherchez la chaîne angular/packages dans la sortie :

$ export bin=$(bazel info bazel-bin)
$ find $bin -type f -exec fgrep -l angular/packages {} \; | grep -v ngsummary | grep -v ngfactory

nous supprimons les fichiers ngsummary car ils ont toujours eu des chemins sur le disque comme identifiants de module.
Les fichiers ngfactory ne sont pas livrés avec le package, ils sont donc probablement inoffensifs également.

Fait intéressant, nous trouvons la mauvaise importation dans la sortie 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";  // <-------------------------

mais pas dans la sortie 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

Commentaire le plus utile

Nous rencontrons également ce problème maintenant.

Nous appelons les API du compilateur en interne dans un mono-repo, cela se traduit pour nous en interne également par des chemins d'importation tels que :

import * as i1 from "@our-group/our-package/src/some-service";

Cela se produit pour nous dans la sortie ES5, mais je suppose que la cause première est similaire.
Les solutions de contournement pour nous consistent à définir l'usine nous-mêmes dans le @Injectable. Cela empêche angulaire de générer l'usine et donc de générer l'importation défectueuse.

Je ne sais pas si je dois fournir plus d'informations / reproductibles :

  • ce serait très difficile pour moi de le faire car il s'agit d'un mélange de code propriétaire.
  • Je pense que vous connaissez déjà la cause, mais actuellement, naturellement, ne la priorisez pas en partant du principe que cela ne se produit qu'en interne chez Angular.

>Tous les commentaires

Nous rencontrons également ce problème maintenant.

Nous appelons les API du compilateur en interne dans un mono-repo, cela se traduit pour nous en interne également par des chemins d'importation tels que :

import * as i1 from "@our-group/our-package/src/some-service";

Cela se produit pour nous dans la sortie ES5, mais je suppose que la cause première est similaire.
Les solutions de contournement pour nous consistent à définir l'usine nous-mêmes dans le @Injectable. Cela empêche angulaire de générer l'usine et donc de générer l'importation défectueuse.

Je ne sais pas si je dois fournir plus d'informations / reproductibles :

  • ce serait très difficile pour moi de le faire car il s'agit d'un mélange de code propriétaire.
  • Je pense que vous connaissez déjà la cause, mais actuellement, naturellement, ne la priorisez pas en partant du principe que cela ne se produit qu'en interne chez Angular.
Cette page vous a été utile?
0 / 5 - 0 notes