2015-04-07 25 views
20

Tôi có một ứng dụng EmberJS nhỏ sử dụng Ember-Cli. Ứng dụng của tôi có một thư viện ES6 riêng, đó là một sự phụ thuộc bower. Về cơ bản, những gì tôi muốn là để nhập khẩu các thư viện và sử dụng nó bất cứ nơi nào tôi muốn.Sử dụng thư viện ES6 trong dự án Ember-cli

Nếu tôi không sai, tôi nên transpile thư viện trong brocfile.js và sử dụng nó sau đó. Thật không may, tôi không thể cung cấp quá nhiều thông tin cụ thể nhưng tôi sẽ cố gắng hết sức để có thể rõ ràng hơn.

thư viện bên ngoài của tôi được đặt tên main-lib và được cấu trúc theo cách sau (nó được làm việc trong một dự án khác):

  • bower_components
    • chính-lib
      • api.js
      • chính .js
      • message.js

Trong tập tin main.js, tôi có như sau:

import Api from 'main/api'; 
import Message from 'main/message'; 

var main = {}; 

main.api = Api; 
main.message = Message; 

export default main; 

Vì vậy, những gì tôi muốn làm, là, trong ứng dụng của tôi, nhập khẩu main và sử dụng các chức năng khác nhau Nó chứa.

Ví dụ, trong một emberjs điều khiển nhất định:

import Main from 'main'; 

//use Main here 

Để làm như vậy, tôi nghĩ về cách làm như sau trong brocfile.js tôi

var tree = 'bower_components/main-lib'; 
var ES6Modules = require('broccoli-es6modules'); 
var amdFiles = new ES6Modules(tree, { 
    format: 'amd', 
    bundleOptions: { 
    entry: 'main.js', 
    name: 'mainLib' 
    } 
}); 

Tuy nhiên, điều này không có gì. Về cơ bản, tôi muốn các tập tin transpiled được bao gồm trong vendor.js hoặc một nơi nào đó mà tôi sẽ có thể sử dụng thư viện bằng cách nhập nó.

Có điều gì đó tôi thiếu ở đây nhưng tôi không thể xác định chính xác.

Edit1: Sau khi thêm những dòng này vào cuối brocfile.js tôi:

mergeTrees = require('broccoli-merge-trees') 

module.exports = mergeTrees([app.toTree(), amdFiles]); 

tôi có thể nhận được một ES5 trông như thế này:

define(['main/api', 'main/message'], function(api, message) { 

    var main = {}; 

    main.api = Api; 
    main.message = Message; 

    var _main = main; 
    return _main; 
}); 

Vấn đề là nó cũng không nhập main/apimain/message. Tôi có phải lặp lại mã cho mỗi tệp mà tôi muốn không?

Ngoài ra, các tập tin được không nối trong vendor.js mà chỉ đơn giản nhưng tại thư mục gốc của /dist

Trả lời

5

Bạn có những điều sau đây: import Api from 'main/api' - nhưng tôi không thấy một thư mục có tên main đến những gì bạn đã giải thích - chỉ là một thư mục có tên main-lib ...

Nó có thể được rằng main/apimain/message không được tính bởi vì họ thực sự không tồn tại? Bạn có thể cần phải sử dụng main-lib/apimain-lib/message trong main.js tập tin của bạn

+0

Cấu trúc phân cấp như sau main-lib/(main.js | api.js | message.js) Tôi có nên nhập 'api' sau đó không? – etiennenoel

+0

Tôi mong đợi "nhập Api từ './api'" để hoạt động giống như trong Ember. – jmurphyau

+0

Tại sao đây là câu trả lời được chấp nhận, nó có hình dạng giống như một bình luận hơn là một câu trả lời. Tôi thường sử dụng cây hợp nhất để nhập tất cả mã trong tuy nhiên có một tùy chọn dễ dàng hơn bây giờ bằng cách sử dụng: https://www.npmjs.com/package/broccoli-es6modules – jonathanKingston

2

Sự tích hợp của Bông cải xanh với ember-cli đã bao gồm một transpiler, vì vậy tôi nghĩ rằng một cái gì đó như thế này là đủ:

app.import('bower_components/main-lib/main.js', { 
    type: 'vendor', 
    exports: { 'main': ['default'] } 
); 

Và sau đó bạn có thể:

import Main from 'main'; 

Với những gì bạn đang có trong Brocfile của bạn, bạn vẫn cần phải hợp nhất amdFiles (app.import của bạn sẽ làm điều đó cho bạn).

Cái gì như:

mergeTrees = require('broccoli-merge-trees') 


module.exports = mergeTrees([app.toTree(), amdFiles]); 

Không ai trong số này được thử nghiệm, nhưng bạn sẽ có được ý tưởng.

+0

Làm điều đầu tiên bạn được đề cập, đó là app.import, đặt nội dung của main.js trong tệp vendor.js nhưng không transpile nó .... – etiennenoel

+0

Nếu tôi giữ mã trước đó và thêm phần thứ hai của câu trả lời, mã không tìm thấy chính nó trong tệp vendor.js ... – etiennenoel

+0

Tôi đã cập nhật câu hỏi của tôi, cảm ơn thời gian của bạn. – etiennenoel

2

Ember dường như là advocating sử dụng: https://www.npmjs.com/package/broccoli-es6modules

Điều này có nghĩa nhập khẩu mô-đun của bạn sẽ giống như thế:

var mergeTrees = require('broccoli-merge-trees'); 

var tree = './bower_components/main-lib'; 
var ES6Modules = require('broccoli-es6modules'); 
var amdFiles = new ES6Modules(tree, { 
    format: 'amd', 
    bundleOptions: { 
    entry: 'main.js', 
    name: 'main-lib' 
    } 
}); 

module.exports = mergeTrees([app.toTree(), amdFiles]) 
+0

@etiennenoel bạn đã thử phương pháp này chưa? – jonathanKingston

Các vấn đề liên quan