1

我正在拼命尝试通过 Bower 在 Ember CLI 中包含 SockJS。我尽可能地关注文档。这些是似乎几乎可以工作的步骤:

  • 添加"sockjs-client": "0.3.4"bower.json
  • 跑了bower install
  • 将以下内容添加到Brocfile.js

    app.import('vendor/sockjs-client/lib/index.js', {'sockjs': ['sockjs'] });

  • 添加import { SockJS as SockJS } from 'sockjs';到我的模块中。我也尝试过import SockJS from 'sockjs';各种其他组合......

这至少似乎编译和ember server运行没有错误。但是,一旦我在浏览器中打开该页面,我就会收到以下错误:

Uncaught ReferenceError: SockJS is not defined

创建的显示错误的源代码如下所示:

SockJS = (function(){
              var _document = document;
              var _window = window;
              var utils = {};

<!-- include lib/reventtarget.js -->
<!-- include lib/simpleevent.js -->
<!-- include lib/eventemitter.js -->
<!-- include lib/utils.js -->
<!-- include lib/dom.js -->
<!-- include lib/dom2.js -->
<!-- include lib/sockjs.js -->
<!-- include lib/trans-websocket.js -->
<!-- include lib/trans-sender.js -->
<!-- include lib/trans-jsonp-receiver.js -->
<!-- include lib/trans-jsonp-polling.js -->
<!-- include lib/trans-xhr.js -->
<!-- include lib/trans-iframe.js -->
<!-- include lib/trans-iframe-within.js -->
<!-- include lib/info.js -->
<!-- include lib/trans-iframe-eventsource.js -->
<!-- include lib/trans-iframe-xhr-polling.js -->
<!-- include lib/trans-iframe-htmlfile.js -->
<!-- include lib/trans-polling.js -->
<!-- include lib/trans-receiver-eventsource.js -->
<!-- include lib/trans-receiver-htmlfile.js -->
<!-- include lib/trans-receiver-xhr.js -->
<!-- include lib/test-hooks.js -->
                  return SockJS;
          })();

在 Ember CLI 中包含 SockJS 的正确方法是什么?

编辑

经过更多的试验和错误,我从浏览器的角度得到了以下工作:

西兰花.js:

app.import('vendor/bower-sockjs-client/sockjs.js', {
  'sockjs-client': ['sockjs-client']
});
module.exports = app.toTree();

bower.json:

  "dependencies": {
    "handlebars": "~1.3.0",
    "jquery": "^1.11.1",
    "qunit": "~1.12.0",
    "ember-qunit": "~0.1.5",
    "ember": "1.5.1",
    "ember-resolver": "~0.1.1",
    "loader": "stefanpenner/loader.js#1.0.0",
    "ember-cli-shims": "stefanpenner/ember-cli-shims#0.0.2",
    "ember-load-initializers": "stefanpenner/ember-load-initializers#0.0.2",
    "ember-qunit-notifications": "^0.0.1",
    "ember-cli-test-loader": "rjackson/ember-cli-test-loader#0.0.2",
    "bower-sockjs-client": "0.3.4"
  }

并且模块内没有任何导入。

这让 Ember CLI 抱怨了很多:'SockJS' is not defined.但它至少现在可以工作。我正在做的事情有什么问题吗,或者这是 Ember CLI 中的错误?

4

3 回答 3

3

我知道你已经解决了这个问题。但这里是对出了什么问题的解释。我也遇到了问题,所以我想我会看看引擎盖下发生了什么。

您通过 bower "sockjs-client" 下载的库不包含分发文件。您将需要自己构建它。为此,您需要make命令。如果你是 linux 或 mac,你已经拥有了。如果在 Windows 上,您需要下载cygwinmingw

要构建 sockjs,请转到终端中的 vendor/sockjs-client/ 并执行命令

npm install
make build

这将生成 2 个文件 sockjs.min.js 和 sockjs.js。

现在您可以将此文件包含在您的 Brocfile.js 中

app.import('vendor/sockjs-client/sockjs.min.js');

现在SockJS应该可以作为全局变量使用。您现在使用的包“bower-sockjs-client”只是一个共享 dist 文件的分支。如果您正在使用它,请确保它是最新的。

由于SockJS是全局的,因此您需要将其添加到jshintrc文件中。

{
  "predef": {
    "document": true,
    "window": true,
    "Demo1ENV": true,
    "SockJS": true
  }
}

为什么导入不起作用 -

无法导入包的原因是 SockJS 对 amd 使用了某种 UMD 语法。他们执行以下检查以查看它是否可以使用 amd 语法。

typeof define == "function" && define.amd

ember-cli 使用最小的 loader.js 来加载 amd 模块并且define.amd未设置,因此在上面的代码中它将评估为 false。即使修改 loader.js 文件,SockJS 的 amd 定义也不兼容 ES6 转译器。ES6 转译器期望模块被导出到“默认”键。

import sockjs from 'sockjs';  will become something like
var sockjs = _dependency_1['default'];
but SockJS is _dependency_1, _dependency_1['default'] will be undefined.
于 2014-06-23T15:44:47.167 回答
1

鉴于 SockJS 没有适当的模块加载支持,我只是将以下内容放入我的 Brocfile

app.import('bower_components/sockjs-client/dist/sockjs-1.0.0-beta.12.js');

然后在我的控制器顶部,我有

import Ember from 'ember';
let SockJS = window.SockJS; 
于 2015-04-12T20:55:55.893 回答
0

我有类似的问题,所以我为 Ember 开发了一个插件,添加了预期的 sockjs 语法等。

ember-sockjs

于 2015-04-06T07:20:57.213 回答