Angular: Неправильный импорт, написанный древовидными провайдерами под Bazel

Созданный на 15 мая 2018  ·  1Комментарий  ·  Источник: angular/angular

Провайдеры с встряхиванием дерева запускают компилятор Angular для введения операторов импорта в код пользователя, чего мы раньше не делали. Оказывается, у нас есть места, где мы объединяем пути модулей на диске с именами модулей (в более ранних версиях компилятора такого различия не было)
В итоге мы пишем импорт типа import {} from 'wksp/packages/path/to/thing' который должен был быть import {} from '@pkg_name/path/to/thing'

Насколько нам известно, эта проблема затрагивает только пользователей Bazel, которые компилируют с помощью ngc и используют поставщиков с поддержкой древовидной структуры. Пока мы видели эту проблему только внутри Angular.

Это было найдено как часть # 20030

Чтобы воспроизвести, добавьте провайдер с изменяемым деревом, например, вставьте в 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 {}

затем создайте пакет npm

bazel build //packages/common:npm_package

И найдите в выводе строку angular/packages :

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

мы удаляем файлы ngsummary, потому что у них всегда были пути на диске в качестве идентификаторов модулей.
Файлы ngfactory не поставляются с пакетом, поэтому они, вероятно, тоже безвредны.

Интересно, что в выводе 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";  // <-------------------------

но не на выходе 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

Самый полезный комментарий

Мы сейчас тоже сталкиваемся с этой проблемой.

Мы вызываем API компилятора изнутри в монорепозитории, это приводит для нас внутренне также к путям импорта, например:

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

Это происходит с нами в выходных данных ES5, но я предполагаю, что основная причина аналогична.
Обходной путь для нас - это определение фабрики самостоятельно в @Injectable. Это мешает angular генерировать фабрику и, таким образом, генерировать ошибочный импорт.

Не уверен, нужно ли мне предоставить дополнительную информацию / воспроизвести:

  • мне было бы очень сложно это сделать, поскольку это смесь проприетарного кода.
  • Я считаю, что вы уже знаете причину, но в настоящее время, по понятным причинам, не расставляйте приоритеты, исходя из предположения, что это происходит только внутри Angular.

>Все замечания

Мы сейчас тоже сталкиваемся с этой проблемой.

Мы вызываем API компилятора изнутри в монорепозитории, это приводит для нас внутренне также к путям импорта, например:

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

Это происходит с нами в выходных данных ES5, но я предполагаю, что основная причина аналогична.
Обходной путь для нас - это определение фабрики самостоятельно в @Injectable. Это мешает angular генерировать фабрику и, таким образом, генерировать ошибочный импорт.

Не уверен, нужно ли мне предоставить дополнительную информацию / воспроизвести:

  • мне было бы очень сложно это сделать, поскольку это смесь проприетарного кода.
  • Я считаю, что вы уже знаете причину, но в настоящее время, по понятным причинам, не расставляйте приоритеты, исходя из предположения, что это происходит только внутри Angular.
Была ли эта страница полезной?
0 / 5 - 0 рейтинги