将Undercore导入Angular 2 CLI项目

Import Underscore to Angular 2 CLI project

本文关键字:CLI 项目 Angular Undercore 导入      更新时间:2023-09-26

我已经用Angular CLI工具启动了一个新项目。在那之后,我遵循这个官方指南导入Undercore,我做正如它所说的那样。

但当我试图在我的应用程序组件中使用Undercore时,我的项目仍然在浏览器中崩溃,并显示错误消息:

原始异常:引用错误:_未定义

Underscore被添加到dist/vender文件夹中,所以我猜问题出在Systemjs配置中。

这是我的angular cli构建:

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 });

我的应用程序组件:

/// <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;
}

我哪里错了?

为什么这么复杂?社区会接受仅仅添加一个简单的第三方图书馆这么麻烦吗?

您的配置基本上设置了underscore,因此SystemJS可以在需要时找到它。

当您更改system-config.ts时,您告诉SystemJS:如果有人要求underscore,它是一个文件underscore.js,可以在vendor/underscore/文件夹中找到,它的模块格式是CommonJS(cjs)。

angular-cli-build.js中的更改用于告诉angular cli应该拾取哪些文件并将其放入vendor文件夹。(所以,如果你告诉SystemJS它会在那里找到下划线,这就是它在那里的原因。)

但仅凭并不能将下划线导入/添加到应用程序的全局范围中。

您必须在每个.ts文件中导入它,这样SystemJS就会将它添加到该模块的已传输.js中。

代替这两条线:

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

将此添加到您的文件中:

import * as _ from 'underscore';

如果您有问题,请尝试检查在浏览器中执行的生成的.js源代码。在您的案例中,您可能会发现没有require()方法导入underscore

添加第三方lib的doco具有误导性。我已经撞了一个多小时了!

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

你需要的是

/// <reference path="../../../typings/globals/underscore/index.d.ts" />
import * as _ from 'underscore';