让Cesium,SystemJS和Angular2工作?

时间:2016-11-23 20:26:42

标签: angular typescript systemjs cesium

有人有一个工作示例,其中SystemJS(不是Webpack)与Angular2(在TypeScript中,而不是Dart)与Cesium(npm)一起使用?

我知道这篇关于cesiumjs的博客文章'现场: https://cesiumjs.org/2016/01/26/Cesium-and-Webpack/

我喜欢作者的说法,"你不能简单地做require('cesium')。"该文章的问题在于它使用Webpack方式,而我没有。

无论哪种方式,我都希望解决这个特殊错误(来自浏览器): Error: (SystemJS) AMD module http://localhost:3000/node_modules/cesium/Build/CesiumUnminified/Cesium.js did not define

以下是我所拥有的:

在我的systemjs.config.js文件中:

paths: {'npm:' :  'node_modules/'},
map: {
    // our app is within the dist folder
    app: 'dist',

    // angular bundles
    '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
    ...

    'require': 'npm:requirejs/require.js',
    'cesium': 'npm:cesium/Build/CesiumUnminified/Cesium.js',

    // Other packages
    ...
}

@Injectable()示例:

let Cesium = require('cesium');
import { Injectable } from '@angular/core';

@Injectable()

export class CesiumClock {
    private _start:any = Cesium.JulianDate.now();
    private _stop:any = Cesium.JulianDate.addHours(this._start,12,new Cesium.JulianDate());
    private _clock:any = new Cesium.Clock({
        startTime: this._start,
        stopTime: this._stop,
        currentTime: this._start,
        clockRange: Cesium.ClockRange.LOOP_STOP,
        mutliplier: 1,
        shouldAnimate: true
    });
}

最后,客户端代码尝试使用我的' CesiumClock',并在浏览器中向我提供错误(在转换后):

import { Component } from '@angular/core';
import { CesiumClock } from '../services/index';

@Component({
    moduleId: module.id.replace("/dist", "/app"),
    templateUrl: 'stuff.component.html',
    styleUrls: [
        'stuff.css',
        'node_modules/cesium/Build/Cesium/Widgets/widgets.css'
    ]
 })

export class StuffComponent {
    constructor(private _cesiumClock:CesiumClock) {}
}

更新

根据@artem的答案,我能够删除特定的错误:(SystemJS)AMD'来自浏览器。但是现在,如果我想引用任何Cesium,那么new Cesium.Viewer(...) Cesium对象只是一个空白的板块。我看到的错误是

Cesium.Viewer is not a constructor

3 个答案:

答案 0 :(得分:4)

感谢@artem睁开眼睛看这个。这是我的最终答案对我有用:

systemjs.config.js (请参阅'cesium'下的packages并注意全局变量CESIUM_BASE_URL

(function(global){
    global.CESIUM_BASE_URL = './node_modules/cesium/Build/CesiumUnminified';
    System.config({
        paths: {
            // paths serve as alias
            'npm:': 'node_modules/'
        },
        map: {
            ...
            // paths serve as alias
            'cesium': 'npm:cesium/Build/CesiumUnminified'
            ...
        },
        packages: {
            ...
            'cesium': {
                main: './Cesium.js',
                meta: {
                    '*.js': {
                        format: 'cjs'
                    }
                }
            },
            ...
        }
    });
})(this);

cesium.viewer.ts (注意合并的declareimport语句。声明允许typescript编译器了解Cesium。import语句是它在浏览器中工作。):

declare var Cesium:any;
import 'cesium';

@Injectable()
export class CesiumViewer {
    ...
    this._viewer = new Cesium.Viewer(elem, {...});
    ...
}

我相信,meta部分有帮助,因为Cesium实际上需要一大堆.js文件。没有meta *.js属性,它只会抓取Cesium.js,这是不够的,无论是否缩小,是否来源。

现在,我遇到了一个重大的CSS危机。 Cesium地图是浏览器中的一大堆垃圾。

答案 1 :(得分:2)

SystemJS自动检测CesiumUnminified/Cesium.js的格式为amd,但无论出于何种原因,它都不能用作带有SystemJS的amd模块。如果将其格式设置为CommonJS,则可以加载它,即:

    map: {
         ...
        'cesium': 'npm:cesium/Build/CesiumUnminified',

    packages: {
            ...
        cesium: {
            main: 'Cesium.js',
            format: 'cjs'
        },

更新看起来SystemJS无法使用node_modules/cesium/Build中提供的两个版本:映射到Cesium结果中的CesiumUnminifiedBuildimport Cesium = require('cesium');中返回一个空对象。

但是,它可以从node_modules/cesium/Source中提供的来源加载。当我从format: 'cjs'包中删除cesium并将映射更改为'cesium': 'npm:cesium/Source'时,我可以获取此代码

 import Cesium = require('cesium');
 console.dir(Cesium.Viewer);

打印

 function Viewer(container, options)

在控制台中。不知道它是否真的有效。

答案 2 :(得分:0)

我通过使用稍微不同的配置让Cesium与Angular 2和SystemJS一起工作,因为上面的答案对我不起作用。

<强> systemjs.config.js:

(function (global) {
  global.CESIUM_BASE_URL = './node_modules/cesium/Build/CesiumUnminified';
  System.config({
    paths: {
      // paths serve as alias
      'npm:': 'node_modules/'
    },
    // map tells the System loader where to look for things
    map: {
     ...
     'cesium': 'npm:cesium/Build/CesiumUnminified'
     ...
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
  ...
  'cesium': {
    main: './Cesium.js',
    meta: {
      '*.js': {
        format: 'global'
      }
    }
  }
}
});
})(this);

这是 app.component.js

import 'cesium';