Ember.js 在Ember CLI中将SockJS作为AMD导入

Ember.js 在Ember CLI中将SockJS作为AMD导入,ember.js,amd,sockjs,ember-cli,Ember.js,Amd,Sockjs,Ember Cli,我拼命想通过Bower在Ember CLI中包含SockJS。 我已经尽可能地密切关注这些文件。这些步骤似乎几乎奏效: 添加了“sockjs客户端”:“0.3.4”到bower.json 运行bower安装 将以下内容添加到Brocfile.js app.import('vendor/sockjs client/lib/index.js'{ “sockjs”:[ “sockjs” ] }); 添加了从“SockJS”导入{SockJS as SockJS}的import到我的模块。我试过从“S

我拼命想通过Bower在Ember CLI中包含SockJS。 我已经尽可能地密切关注这些文件。这些步骤似乎几乎奏效:

  • 添加了
    “sockjs客户端”:“0.3.4”
    bower.json
  • 运行
    bower安装
  • 将以下内容添加到
    Brocfile.js

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

  • 添加了从“SockJS”导入{SockJS as SockJS}的
    import到我的模块。我试过从“SockJS”导入SockJS和各种其他组合以及

这至少看起来是编译的,
ember服务器
运行时没有错误。但是,在浏览器中打开页面后,我会收到以下错误:

未捕获引用错误:未定义SockJS

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

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;
          })();
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”没有定义。
但是它至少目前可以工作。我所做的有什么问题吗?或者这是Ember CLI中的错误吗?

我知道您已经解决了这个问题。但这里有一个错误的解释。我也有问题,所以我想我会看看引擎盖下发生了什么

通过bower“sockjs客户端”下载的库不包含分发文件。你需要自己建造它。为此,需要使用
make
命令。如果你是linux或mac,你已经有了它。如果在windows上,您需要下载
cygwin
mingw

要构建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文件的fork。如果您正在使用它,请确保它是最新的

由于
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 transpiler不兼容。ES6 transpiler期望将模块导出为“默认”键

import sockjs from 'sockjs';  will become something like
var sockjs = _dependency_1['default'];
but SockJS is _dependency_1, _dependency_1['default'] will be undefined.

我知道你已经解决了这个问题。但这里有一个错误的解释。我也有问题,所以我想我会看看引擎盖下发生了什么

通过bower“sockjs客户端”下载的库不包含分发文件。你需要自己建造它。为此,需要使用
make
命令。如果你是linux或mac,你已经有了它。如果在windows上,您需要下载
cygwin
mingw

要构建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文件的fork。如果您正在使用它,请确保它是最新的

由于
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 transpiler不兼容。ES6 transpiler期望将模块导出为“默认”键

import sockjs from 'sockjs';  will become something like
var sockjs = _dependency_1['default'];
but SockJS is _dependency_1, _dependency_1['default'] will be undefined.

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


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


鉴于SockJS没有适当的模块加载支持,我将以下内容放在我的文件中

app.import('bower_components/sockjs-client/dist/sockjs-1.0.0-beta.12.js');
然后在控制器的顶部,我有

import Ember from 'ember';
let SockJS = window.SockJS; 

考虑到SockJS没有适当的模块加载支持,我只是将以下内容放在我的文件中

app.import('bower_components/sockjs-client/dist/sockjs-1.0.0-beta.12.js');
然后在控制器的顶部,我有

import Ember from 'ember';
let SockJS = window.SockJS; 

是的,看起来导入没有包括任何实际的sockjs文件,只是index.jsI用一些至少目前看来有效的东西编辑了这个问题,尽管感觉不对。是否有任何方法可以通过配置包含缺少的文件?是的,导入似乎没有包含任何实际的sockjs文件,只是index.jsI用一些至少目前看来有效的东西编辑了这个问题,尽管它感觉不对。有没有办法通过配置包含丢失的文件?谢谢,这是一个很好的解释。我并没有真正解决这个问题,我只是找到了一个难看的解决方法:)有没有办法使用Ember CLI来自动执行make命令的步骤?我尝试了您的建议,发现了一些东西:在执行
make build
命令之前需要的构建
npm安装
。之后,我可以按照您提到的方式导入SockJS,但是ember CLI仍然抱怨:
myapp/adapters/application.js:第58行,第26列,“SockJS”没有定义。我如何摆脱余烬CL