2016-10-04 2 views
6

С обновлением до rc.0, я получаю следующее сообщение об ошибке сборки сделать с moment.js (который я установил через НПМ):Ионные 2: Как исправить использование moment.js ошибок

[13:44:16] Error: Cannot call a namespace ('moment') 

Я попытался ссылающийся момент двумя способами:

  • import * as moment from 'moment';
  • import moment from 'moment'

Ошибка совпадает.

Q) Что я делаю неправильно? Это работало до RC.0

+0

У меня та же проблема, похоже, что это известная проблема - HTTPS : // GitHub.com/driftyco/ionic-app-scripts/issues/68 –

ответ

3

С import * as Moment from 'moment'; Я получаю сообщение об ошибке: Не могу назвать пространство имен («Момент»).

Изменение его на import Moment from 'moment'; разрешило проблему.

+5

import Moment from 'moment' не принимается машинописным компилятором (не менее 2.1.6) – abreneliere

3

Вы удвоили флажок во всех ваших файлах проекта, которые вы внесли в это изменение, поскольку это звучит так, как будто вы просто пропустили его?

Попробуйте изменить момент-node.d.ts из

экспорта = момент; - момент экспорта по умолчанию;

это разоблачит любые недостающие файлы. (Затем измените его обратно.)

3

Вам нужно добавить момент к типам в TSconfig

{ 
    "compilerOptions": { 
    "allowSyntheticDefaultImports": true, 
    "declaration": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "lib": [ 
     "dom", 
     "es2015" 
    ], 
    "module": "es2015", 
    "moduleResolution": "node", 
    "target": "es5", 
    "typeRoots": [ 
     "../node_modules/@types" 
    ], 
    "types": [ 
     "moment" <====== THIS 
    ] 
    }, 
    "exclude": [ 
    "node_modules" 
    ], 
    "compileOnSave": false, 
    "atom": { 
    "rewriteTsconfig": false 
    } 
} 

Кроме того, необходимо добавить ссылку на данный момент в CommonJS в @ ионных rollup.config.js-х

var ngTemplate = require('../dist/plugins/ng-template').ngTemplate; 
var nodeResolve = require('rollup-plugin-node-resolve'); 
var commonjs = require('rollup-plugin-commonjs'); 

// https://github.com/rollup/rollup/wiki/JavaScript-API 

var rollupConfig = { 

    useStrict: false, 

    /** 
    * entry: The bundle's starting point. This file will 
    * be included, along with the minimum necessary code 
    * from its dependencies 
    */ 
    entry: './.tmp/app/main.dev.js', 

    /** 
    * sourceMap: If true, a separate sourcemap file will 
    * be created. 
    */ 
    sourceMap: true, 

    /** 
    * format: The format of the generated bundle 
    */ 
    format: 'iife', 

    /** 
    * dest: the output filename for the bundle in the buildDir 
    */ 
    dest: 'main.js', 

    /** 
    * plugins: Array of plugin objects, or a single plugin object. 
    * See https://github.com/rollup/rollup/wiki/Plugins for more info. 
    */ 
    plugins: [ 
    ngTemplate(), 
    commonjs({ 
     include: [ 
     'node_modules/moment/**' 
     ] 
    }), 
    nodeResolve({ 
     module: true, 
     jsnext: true, 
     main: true, 
     browser: true, 
     extensions: ['.js'] 
    }) 
    ] 

}; 

if (process.env.IONIC_ENV == 'prod') { 
    // production mode 
    rollupConfig.entry = '.tmp/app/main.prod.js'; 
    rollupConfig.sourceMap = false; 
} 

module.exports = rollupConfig; 
+0

Это также работает для firebase и lodash, и я представляю другие сторонние рамки. –

+0

Это не работает: у меня все еще есть сообщение: Не могу назвать пространство имен ('moment') – abreneliere

1

Вот что я сделал, чтобы сделать рабочий момент с машинописным текстом (2.1.6) и rollup (0.41.4).

  1. Чтобы импортировать момент, сохранить стандартный путь:

    import * as moment from 'moment';

import moment from 'moment'; нестандартное для пакета без экспорта по умолчанию, это приведет к ошибке во время выполнения: moment_1.default is not a function

  1. В машинописном использовании момент с помощью литья mo Мента, как любой, и вызовите default функцию:

    var momentFunc = (moment as any).default ? (moment as any).default : moment; 
    var newFormat = momentFunc(value).format(format); 
    

moment(value).format(format) приведет к ошибке в накопительный пакет дерева встряхивания: Cannot call a namespace ('moment')