Теперь библиотека компилируется нормально для меня.

ою библиотеку компонентов Angular (2+), используяjvandemo / генератор-angular2-библиотека как стартер, который используетСвернуть как сборщик модулей. Компонент, который я создаю в библиотеке, используетMomentJS.

У меня были различные проблемы со сборкой с включением MomentJS.

Я впервые использовалimport moment from 'moment'; импортировать момент в компонент, но это приводит к следующей ошибке при сборке;

[17:26:28] Starting 'ngc'...
Error at /Users/chris/angular-library/.tmp/components/my-library/my-component.component.ts:6:8: Module '"/Users/chris/my-library/node_modules/moment/moment"' has no default export.

я нашелэтот ТАК вопрос что сказал использоватьimport * as moment from 'moment'; однако с этим я получаю;

'moment' is imported by build/components/my-component.component.js, but could not be resolved – treating it as an external dependency

events.js:182
      throw er; // Unhandled 'error' event
      ^
Error: Cannot call a namespace ('moment')
    at error (/Users/chris/angular-library/node_modules/rollup/dist/rollup.js:185:14)

Насколько я могу судить, это единственные два варианта, и я не могу заставить их работать, что мне не хватает?

редактировать

я добавилЭта проблема в репозиторий Github библиотеки, который содержит минималистичные шаги репликации

 Rahul Singh22 окт. 2017 г., 18:53
Вы используете Cli?
 Chris Brown22 окт. 2017 г., 18:43
@ Конечно, как уже упоминалось выше, это приводит кError: Cannot call a namespace ('moment')
 Surely22 окт. 2017 г., 18:40
stackoverflow.com/a/43257938/4298881для краткости вместо «импортировать момент из« момента »», «импортировать * как момент из« момента »»
 Chris Brown25 окт. 2017 г., 18:59
@PeterS Последняя версия 2 (2.19.1)
 Chris Brown22 окт. 2017 г., 20:23
@ Сергей Я попробовал на всякий случай, но если момент установлен как dev или нет, это не влияет на успешность сборки - вы правы, я думаю, что это должно быть вdependencies неdevDependencies но ошибка остается той же

Ответы на вопрос(3)

когда я использовал следующее:

import { Directive, ElementRef } from '@angular/core';
import * as moment from '../node_modules/moment/moment';
@Directive({
  selector: '[sampleDirective]'
})
export class SampleDirective {

  constructor(private el: ElementRef) {
    moment.isDate('test');
  }

}

Файлы скомпилированы из каталога сборки, который является подкаталогом от корня. Вы получаете дополнительное предупреждение об «этом», упомянутом здесь:

https://github.com/rollup/rollup/issues/794

Мне нужно сказать в заливе, что библиотека является внешней:

  external: [
    '@angular/core',
    '@angular/common',
    'moment'
  ],

А из ссылки на github вы должны добавить блок onwarn в обе секции накопительного пакета: это разделы «rollup: umd» и «rollup: fesm».

onwarn: function(warning) {
    // Skip certain warnings

    // should intercept ... but doesn't in some rollup versions
    if ( warning.code === 'THIS_IS_UNDEFINED' ) { return; }

    // console.warn everything else
    console.warn( warning.message );
},

Это продвинет вас дальше?

 andrea0659028 окт. 2017 г., 11:13
Используя импорт * как момент от 'момента'; должно работать нормально. Если нет, попробуйте удалить npm момент, затем npm i moment @ latest, rm -rf узел / модули и переустановите все ваши deps (npm i)
 Chris Brown27 окт. 2017 г., 21:38
Спасибо за просмотр - это работает для меня тоже при использованииmoment.isDate() но это не работает дляmoment()К сожалению, я в одной точке. Для чего это стоит,import * as moment from 'moment'; работает также при использовании толькоmoment.isDate()так что путь отnode_modules там не нужно
Решение Вопроса

Ошибка: невозможно вызвать пространство имен («момент») при ошибке (/Users/chris/angular-library/node_modules/rollup/dist/rollup.js:185:14)

Это согласно спецификации модуля ES.

Это означает, что следующее является недопустимым способом импортировать момент или что-либо, что вы намереваетесь вызвать, потому что объект пространства имен модуля, такой как созданный* as ns может не называться.

import * as moment from 'moment';

Правильная форма - это форма, котораяngc поднимает ошибку на

import moment from 'moment';

Во-первых, чтобы сделать эту работу, вам нужно указать--allowSyntheticDefaultImports флаг.

tsconfig.json

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true
  }
}

При условии, чтоngc распознает опцию, у вас еще есть дополнительная проблема, чтобы решить.

Указанный выше флаг предназначен для пользователей таких инструментов, как SystemJS или Webpack, которые выполняют синтез, позволяя такой проверке кода выполнить проверку типов.

Начиная с TypeScript 2.7, теперь вы можете указать--esModuleInterop флаг, чтобы язык обеспечивал синтез как часть процесса транспиляции.

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true
  }
}

Обратите внимание, что если вы используете версию TypeScript до 2.7а также если вы компилируете в модули CommonJS, AMD или UMD (например, с--module commonjs) правильный синтаксис импорта скорее

import moment = require('moment');

import = require Синтаксис - это специфическая конструкция TypeScript, которая теперь в основном не нужна. Существует, чтобы приобрести как типа также значение экспорта модуля модуля AMD, CommonJS или UMD. «И» важно, потому чтоconst, var, или жеlet = require вызов создает только имя в пространстве значений, а не в пространстве типов.

кто найдет это в 2018+, с Angular6 и текущим @ angular / cli:

Сегодня я столкнулся с этим и нашелрешение здесь.

import * as moment_ from 'moment';
const moment = moment_;

Теперь библиотека компилируется нормально для меня.

Ваш ответ на вопрос