2014-07-03 21 views
5

Tôi đã readingaboutes6 module loaders và tôi không hoàn toàn hiểu cách hoạt động và hy vọng ai đó có thể khai sáng cho tôi.Làm thế nào để tải công việc mô-đun es6

Trong quy trình công việc thực tế liên kết ở trên họ có một ví dụ như thế này

System.import('app/app').then(function(app) { 
    // app is now the Module object with exports as getters 
}); 

Không có vấn đề với điều đó - Tôi hiểu rồi. Nhưng sau đó tôi thấy các nội dung như thế này

var $ = require('jquery'); 

và thực sự bối rối. Điều gì sẽ xảy ra nếu tại thời điểm cuộc gọi này jquery chưa được chuyển đến trình duyệt? Chủ đề có quay không? Trình duyệt có phân tích cú pháp kịch bản của bạn đằng sau hậu trường và cải cách nó thành một cuộc gọi lại như RequireJs không? Là những gì nó cấu hình? Có những giới hạn cụ thể không?

Ai đó có thể cho tôi tóm tắt không?

+1

Điều thứ hai bạn thấy là "tải mô-đun CommonJS", không phải là ES6 afaik. Nó thực sự [không hoạt động (tốt) trong require.js] (http://requirejs.org/docs/api.html#cjsmodule) – Bergi

+0

@Bergi nó hoạt động tốt trong require.js, trong khi tôi không thích nó có một số trang trong dự án hiện tại của tôi sử dụng requirejs với kiểu commonjs. Requirejs quét tập lệnh của bạn cho các biểu thức commonjs và ghi lại nó thành định dạng amd do đó nó vẫn đang sử dụng gọi lại. Tuy nhiên, trừ khi tôi bị nhầm lẫn, đề xuất của es6 KHÔNG sử dụng gọi lại - do đó sự nhầm lẫn của tôi. –

+0

Có, và việc quét tập lệnh không hoạt động tốt cho tất cả trừ các trường hợp đơn giản nhất. Bạn có thể liên kết một phần của đề xuất ES6 mà bạn muốn nói không? 'System.import' rõ ràng là sử dụng callback. – Bergi

Trả lời

4

Trình tải mô-đun ES6 sẽ tìm nạp nguồn, xác định phụ thuộc và chờ cho đến khi các phụ thuộc đó được tải trước khi thực hiện mô-đun. Vì vậy, do thời gian yêu cầu thực hiện, sự phụ thuộc đã được ngồi đó chờ đợi để được thực thi.

Khi tải CommonJS thông qua trình tải mô-đun ES6, chúng tôi dựa vào phân tích cú pháp tĩnh các câu lệnh yêu cầu từ nguồn và chỉ thực thi nguồn khi yêu cầu đã tải.

Bằng cách này, chúng tôi có thể hỗ trợ CommonJS trong trình duyệt được tải động. Các tham chiếu tham chiếu được xử lý giống như cách chúng được xử lý trong Node.

Cụm từ thông dụng phân tích cú pháp các yêu cầu thực sự khá đáng tin cậy và nhanh chóng, đồng thời tính đến các nhận xét và mã thông báo xung quanh. Xem https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10 cho loại được SystemJS sử dụng.

Có một hạn chế còn lại với cách tiếp cận này và đó là CommonJS động và có điều kiện yêu cầu như if (condition) require('some' + 'name') không được phát hiện đúng cách. Đây là một chi phí cần thiết để làm cho CommonJS hoạt động như một định dạng mô-đun không đồng bộ hoàn toàn trong trình duyệt.

+1

Một thời gian sau khi tôi viết câu hỏi này, chúng tôi đã nhận được [bài viết tuyệt vời về các mô-đun es6] (http://www.2ality.com/2014/09/es6-modules-final.html). Nó trực tiếp mâu thuẫn với một số điều bạn đã nói (tức là phân tích cú pháp regex, cách phụ thuộc vòng tròn hoạt động, và tính khả dụng của động đòi hỏi). Nó cũng có vẻ là một số nhầm lẫn của tôi ít nhất là các mô-đun và bộ tải mô-đun là thông số kỹ thuật riêng biệt mà chỉ có trước đây là hoàn thành. –

+2

Trình tải mô-đun ES6 có hai cách để diễn giải mô-đun: 1. Mô-đun ES6 2. Định dạng mô-đun kế thừa Chúng tôi có thể tạo định dạng mô-đun kế thừa vào bộ nạp mô-đun ES6 qua móc gọi là "nhanh". Bạn nói đúng - Tải mô-đun ES6 có kiểu tham chiếu tròn riêng của nó cũng khác với kiểu CommonJS. Khi viết hỗ trợ CommonJS vào bộ nạp, điều này có thể cho phép hỗ trợ tham chiếu vòng tròn kiểu CommonJS đầy đủ. Về mặt thông số, hành vi của lớp trình nạp mô-đun chính là trong đặc tả ES6, đặc tả riêng biệt là các móc môi trường chính xác là gì. – guybedford

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