如何使用角度为1.5 / es6和webpack的stomp

时间:2017-06-16 13:31:47

标签: angularjs websocket webpack karma-runner stomp

我正在努力将stomp包含在我的项目中。使用两个版本的jmesnil / stomp-websocket或随后的forkJSteunou / webstomp-client。

我尝试正确导入:

import Stomp from 'stompjs';//or 'webstomp-client';
import SockJS from 'sockjs-client';

并加载它:

angular.module('app', [
uiRouter, ngTranslate, ngTranslateStaticFilesLoader, ngResource, ngFilter,
uiBootstrap, Stomp, SockJS
])

但是我得到以下错误(两个版本):

Uncaught Error: [$injector:modulerr] Failed to instantiate module app due to:
Error: [$injector:modulerr] Failed to instantiate module {"VERSIONS":{"V1_0":"1.0","V1_1":"1.1","V1_2":"1.2"}} due to:
Error: [ng:areq] Argument 'module' is not a function, got Object

(即使webstomp.js上面有“功能webpackUniversalModuleDefinition(root,factory)”,显然还没有完全填满它的目的)

可以通过直接在所使用的控制器上“疯狂”地导入它来绕过这个错误,但是然后所有的业力测试都没有运行(错误是:错误:无法找到模块“net”),即使将node: { net: 'empty', tls: 'empty', dns: 'empty' }添加到webpack.config.js。

此时我正在尝试的只是感觉就像怪异的黑魔法。

是否存在lib版本,角度包装等的“星座”,可以使用我的设置(angular 1.5 / es6 / webpack 1.14 / karma)正常工作?

1 个答案:

答案 0 :(得分:3)

不要将其作为依赖项添加到角度模块。 Stomp库不是角度模块。可能有一座桥梁,但我认为没有必要。

要将Stomp与Webpack 2一起使用,只需在您使用Stomp的文件的tomp处使用它,然后将其用作全局变量。

const Stomp = require("stompjs/lib/stomp.js").Stomp;

在您的控制器/服务中:

Stomp.client(...);

修改

这个解决方案对单元测试来说会有点困难,因为你无法轻易地以“角度方式”替换依赖关系。要解决该问题,您可以在主模块文件中将其定义为常量,而不是使用AngularJS提供的DI。

主要模块文件

const Stomp = require("stompjs/lib/stomp.js").Stomp;

angular
    .module('app', [
        // dependencies
    ])
    .constant('Stomp', Stomp)
    // other controllers/services/etc.

<强>控制器/服务

function MyController(Stomp) {

    Stomp.client(...);

}