【问题标题】:Get Cesium, SystemJS, and Angular2 to work?让 Cesium、SystemJS 和 Angular2 工作?
【发布时间】:2016-11-23 20:26:41
【问题描述】:

是否有人有一个工作示例,其中 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

【问题讨论】:

标签: angular typescript systemjs cesium


【解决方案1】:

感谢@artem 让我对此大开眼界。这是对我有用的最终答案:

systemjs.config.js(请参阅packages 下的'cesium' 并注意全局变量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 的组合语句。声明允许打字稿编译器了解Cesium。导入语句是它在浏览器。):

declare var Cesium:any;
import 'cesium';

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

我相信,meta 部分会有所帮助,因为 Cesium 实际上需要大量 .js 文件。没有meta*.js属性,就只能抓取Cesium.js,不管缩小与否,Source与否。

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

【讨论】:

  • 还不适合我 :-/ 我确实收到了错误 EXCEPTION: Uncaught (in promise): Error: Error in :0:0 caused by: Unable to process binding "click: function (){return function(){ cameraClicked.raiseEvent(this);} }" Message: n(...).bind is not a function TypeError: Unable to process binding "click: function (){return function(){ cameraClicked.raiseEvent(this);} }" Message: n(...).bind is not a function 任何想法?
  • @mfreiholz - 我想你可能有一个单独的问题。我会发布一个问题,如果您认为它会有所帮助,请将此问题与您的设置相关联?如果我们的问题是重复的,肯定有人会注意到它。
【解决方案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 中提供的两个版本:映射到Build 中的CesiumCesiumUnminified 会导致import Cesium = require('cesium'); 返回一个空对象.

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

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

打印

 function Viewer(container, options)

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

【讨论】:

  • 我想给你一张绿色支票,但直到今天我才有机会测试它。谢谢!
  • 所以,这解决了我得到的错误,但它并没有使铯在我的@Components 中可用。 Cesium.Viewer 未定义,Cesium.someFunctionThatIsDefined 不是函数。
  • 是的,BuildCesium.js 的格式对我来说并不熟悉,我不确定 SystemJS 是否支持。但是我可以从node_modules/cesium/Source 加载填充的cesium 对象,不知道它有多大用处。我更新了答案。
【解决方案3】:

我通过使用稍微不同的配置让 Cesium 与 A​​ngular 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多