2016-07-26 5 views
1

Я начал новый проект с помощью инструмента Angular CLI. После этого я следую this official guide, чтобы импортировать Underscore, и я делаю точно, как говорится.Импорт Подчеркнутый в Угловой проект 2 CLI

Но все-таки мой проект вылетает в браузере, когда я пытаюсь использовать подчеркивание в моем app.component с сообщением об ошибке:

ORIGINAL EXCEPTION: ReferenceError: _ is not defined

Подчеркивание добавляется в папку/поставщика DIST поэтому мое предположение было бы, что проблема заключается в конфигурации Systemjs.

Вот моя угловой кли-сборка:

var Angular2App = require('angular-cli/lib/broccoli/angular2-app'); 

module.exports = function(defaults) { 
    return new Angular2App(defaults, { 
    sassCompiler: { 
     includePaths: [ 
     'src/styles' 
     ] 
    }, 
    vendorNpmFiles: [ 
     'systemjs/dist/system-polyfills.js', 
     'systemjs/dist/system.src.js', 
     'zone.js/dist/**/*.+(js|js.map)', 
     'es6-shim/es6-shim.js', 
     'reflect-metadata/**/*.+(ts|js|js.map)', 
     'rxjs/**/*.+(js|js.map)', 
     'underscore/underscore.js', 
     '@angular/**/*.+(js|js.map)' 
    ] 
    }); 
}; 

Вот моя система-конфигурация:

"use strict"; 

// SystemJS configuration file, see links for more information 
// https://github.com/systemjs/systemjs 
// https://github.com/systemjs/systemjs/blob/master/docs/config-api.md 

/*********************************************************************************************** 
* User Configuration. 
**********************************************************************************************/ 
/** Map relative paths to URLs. */ 
const map: any = { 
    'underscore':     'vendor/underscore/', 
}; 

/** User packages configuration. */ 
const packages: any = { 
    'underscore':     { main: 'underscore.js', format: 'cjs' }, 
}; 

//////////////////////////////////////////////////////////////////////////////////////////////// 
/*********************************************************************************************** 
* Everything underneath this line is managed by the CLI. 
**********************************************************************************************/ 
const barrels: string[] = [ 
    // Angular specific barrels. 
    '@angular/core', 
    '@angular/common', 
    '@angular/compiler', 
    '@angular/forms', 
    '@angular/http', 
    '@angular/router', 
    '@angular/platform-browser', 
    '@angular/platform-browser-dynamic', 

    // Thirdparty barrels. 
    'rxjs', 

    // App specific barrels. 
    'app', 
    'app/shared', 
    /** @cli-barrel */ 
]; 

const cliSystemConfigPackages: any = {}; 
barrels.forEach((barrelName: string) => { 
    cliSystemConfigPackages[barrelName] = { main: 'index' }; 
}); 

/** Type declaration for ambient System. */ 
declare var System: any; 

// Apply the CLI SystemJS configuration. 
System.config({ 
    map: { 
    '@angular': 'vendor/@angular', 
    'rxjs': 'vendor/rxjs', 
    'main': 'main.js' 
    }, 
    packages: cliSystemConfigPackages 
}); 

// Apply the user's configuration. 
System.config({ map, packages }); 

Моего app.component:

/// <reference path="../../typings/globals/underscore/index.d.ts" /> 

import { Component } from '@angular/core'; 

declare var _; 

@Component({ 
    moduleId: module.id, 
    selector: 'app-root', 
    template: `<h1>{{title}}</h1>` 
}) 
export class AppComponent { 
    title = _.version; 
} 

Куда я иду неправильно?

И ПОЧЕМУ Это так сложно? Приведет ли сообщество, что это громоздко просто добавить простую стороннюю библиотеку?

ответ

3

Ваша конфигурация в основном устанавливает underscore, поэтому SystemJS может найти ее при необходимости.

Когда вы изменили system-config.ts, вы сказали SystemJS: если кто-нибудь попросит underscore, это файл underscore.js, который можно найти в папке vendor/underscore/ - и его формат модуля CommonJS (cjs).

Изменение в angular-cli-build.js предназначено для говорить угловой кли, какие файлы он должен выбрать и бросить в папку vendor. (Так что, если вы сказали SystemJS он нашел бы подчеркнуть то, что это то, что делает его там.)

Но одна не импортировать/добавить подчеркивания в глобальную область видимости вашего приложения.

Вам необходимо импортировать его в каждый файл .ts, чтобы SystemJS добавлял его в переполненный .js этого модуля.

Вместо этих двух линий:

/// <reference path="../../typings/globals/underscore/index.d.ts" /> 
declare var _; 

Добавьте к этому файлу:

import * as _ from 'underscore'; 

Если у вас возникли проблемы, попробуйте проверить сгенерированный .js источник выполняется на браузер. В вашем случае вы, вероятно, обнаружите, что нет метода require(), импортирующего underscore.

+0

Я попытался это уже и не работает. Как должны выглядеть настройки system.js, чтобы сделать эту работу? – mottosson

+0

Я действительно не знаю подчеркивания, это действительно зависит от каждой библиотеки, но ваш код кажется, что это может быть правильно (я могу сказать, потому что я точно не знаю). Какую версию подчеркивания вы используете? Вы импортируете его как dev или производственную зависимость? – acdcjunior

+0

Я использую версию 1.8.3 и добавил ее к регулярным зависимостям. Библиотека добавлена ​​в папку dist/vendor, поэтому я предполагаю, что функция angular-cli-build верна и что проблема заключается в конфигурации systemjs. – mottosson

1

Doco добавляет, что сторонняя библиотека вводит в заблуждение. Я уже стуча головой в течение часа!

declare var _; // this won't work. 

Что вам нужно

/// <reference path="../../../typings/globals/underscore/index.d.ts" /> 
import * as _ from 'underscore'; 
Смежные вопросы