2014-06-22 3 views
1

Ember CLI에서 Bower를 통해 SockJS를 필사적으로 포함하려고했습니다. 필자는 가능한 한 문서를 따라갔습니다. 이 거의 작업에 보였다 단계입니다 : bower.json Ember CLI에서 AMD로 SockJS 가져 오기

  • "sockjs-client": "0.3.4"을 추가

    • bower install
    • 를 실행하면 Brocfile.js

      app.import ('업체/sockjs 클라이언트 /에 다음과 같은 추가 lib/index.js ', { 'sockjs ': [ 'sockjs ' ] });

    • import { SockJS as SockJS } from 'sockjs';을 내 모듈에 추가했습니다. 나는이 적어도 컴파일 보인다 import SockJS from 'sockjs'; 및 기타 다양한 조합뿐만 아니라 ...

    및 오류없이 ember server 실행을 시도했다.

    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; 
          })(); 
    

    은 무엇인가 :

    Uncaught ReferenceError: SockJS is not defined

    오류를 보여줍니다 생성 된 소스는, 다음과 같습니다 그러나, 최대한 빨리 브라우저에서 페이지를 열 때, 나는 다음과 같은 오류가 발생합니다 Ember CLI와 함께 SockJS를 포함하는 올바른 방법?

    편집

    는 좀 더 시행 착오 후에 나는 가지고는 A 브라우저의 관점에서 작업 다음

    Brocoli.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 내의 버그입니까?

  • +0

    그렇습니다. 가져 오기에 실제 sockjs 파일 중 하나가없는 것처럼 보입니다. 단지 index.js – Kingpin2k

    +0

    잘못된 것으로 느껴지더라도 적어도 지금은 효과가있는 것으로 편집되었습니다. 구성을 통해 누락 된 파일을 포함시킬 방법이 있습니까? –

    답변

    3

    이미 해결 됐습니다. 그러나 여기에 무엇이 잘못되었는지에 대한 설명이 있습니다. 나는 또한 문제가있어, 그래서 나는 두포의 밑에 계속하고있는 무슨을 볼 것이라는 점을 생각했다.

    bower "sockjs-client"를 통해 다운로드 한 라이브러리에 배포 파일이 없습니다. 너는 너 자신을 그것을 형성 할 필요가있을 것이다. 이를 위해 make 명령이 필요합니다. 당신이 리눅스 또는 Mac 인 경우에, 당신은 이미 가지고있다. 창문에 경우에, 당신은이 두 파일 sockjs을 생성 명령을

    npm install 
    make build 
    

    을 sockjs를 구축 터미널에서/공급 업체/sockjs 클라이언트로 이동 실행하려면 cygwin 또는

    mingw을 다운로드해야합니다.min.js 및 sockjs.js.

    이제

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

    지금 SockJS가 전역 변수로 사용할 수 있어야합니다 당신의 Brocfile.js

    에서이 파일을 포함 할 수 있습니다. 현재 'bower-sockjs-client'를 사용중인 패키지는 dist 파일을 공유하는 포크입니다. 그것을 사용하고 있다면 최신인지 확인하십시오.

    SockJS은 글로벌이므로 jshintrc 파일에 추가해야합니다.

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

    가져 오기가 작동하지 않는 이유는

    - SockJS는 AMD를위한 UMD 구문의 어떤 종류를 사용하기 때문에

    패키지를 가져올 수없는 이유입니다. 그들은 다음 구문을 사용하여 amd 구문을 사용할 수 있는지 확인합니다.

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

    엠-CLI는 AMD 모듈을로드 최소 loader.js를 사용 define.amd는 설정되지 않고, 그래서 상기 코드에서 거짓으로 평가된다. loader.js 파일을 수정하더라도 SockJS의 amd 정의는 ES6 변환기와 호환되지 않습니다. ES6 transpiler는 모듈을 'default'키로 내보낼 것을 기대합니다. 나는에 대한 애드온을 개발 있도록

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

    감사합니다. 좋은 설명입니다. 나는 이것을 실제로 해결하지 못했고, 나는 단지 추악한 해결 방법을 발견했다. Ember CLI를 사용하여 make 명령을 실행하는 단계를 자동화하는 방법이 있습니까? –

    +0

    나는 당신의 제안을 시도하고 몇 가지를 발견했다.'make build' 명령 전에'npm install'을 빌드해야했습니다. 그 다음에는 내가 언급 한대로 SockJS를 가져올 수 있지만 CLI는 여전히 불만 스럽다. myapp/adapters/application.js : line 58, col 26, 'SockJS'는 정의되지 않았다. CLI CLI 오류를 제거하려면 어떻게합니까? import 문에 관해서는,'import sockjs as SockJS' 문을 사용하는 것이 가능할까요? 나는 이것을 시도하지 않았습니다 ... –

    +1

    예, 'npm install'을 사용해야합니다. 나는 그것을 언급하는 것을 잊었다. 오류 메시지는 jshint에서 가져와야합니다. ember-cli는 jshint를 사용하여 실수로 전역 네임 스페이스를 오염시키지 않도록합니다. 따라서 의도적으로 전역 변수를 넣는 경우 해당 변수를 .jshintrc 파일에 추가해야합니다. npm 설치 및 jshint 코드로 내 대답을 업데이트했습니다. 현재로서는 amd 로더와 transpiler를 수정하지 않고 패키지를 가져올 수 없습니다. sockjs의 빌드 자동화를위한 bower postinstall을 살펴보십시오. ember-cli 프로젝트에 문제를 제기하면이 문제를 조사 할 수 있습니다. – blessenm

    0

    나는 비슷한 문제가 있었다 엠버는 sockjs 구문 등

    SockJS 적절한 모듈 로딩을 지원하지 않는 점을 감안 ember-sockjs

    1

    , 난 그냥 다음을 넣어 기대를 부가 내 Brocfile에

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

    는 다음 내 컨트롤러의 상단에, 나는

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