Có thư viện nào dành cho javascript trong trình duyệt cung cấp tính linh hoạt / mô-đun / dễ sử dụng giống như của Node require
không?
Để cung cấp thêm chi tiết: lý do require
rất tốt là nó:
- Cho phép mã được tải động từ các vị trí khác (theo ý kiến của tôi thì tốt hơn về mặt phong cách so với việc liên kết tất cả mã của bạn trong HTML)
- Nó cung cấp một giao diện nhất quán để xây dựng các mô-đun
- Rất dễ để các mô-đun phụ thuộc vào các mô-đun khác (ví dụ: vì vậy tôi có thể viết một API yêu cầu jQuery để tôi có thể sử dụng
jQuery.ajax()
- Javascript đã tải có phạm vi , có nghĩa là tôi có thể tải
var dsp = require("dsp.js");
và tôi có thể truy cậpdsp.FFT
, điều này sẽ không ảnh hưởng đến cục bộ của tôivar FFT
Tôi vẫn chưa tìm thấy một thư viện làm điều này một cách hiệu quả. Các giải pháp thay thế tôi có xu hướng sử dụng là:
coffeescript-concat - đủ dễ dàng để yêu cầu các j khác, nhưng bạn phải biên dịch nó, có nghĩa là nó kém tuyệt vời hơn để phát triển nhanh (ví dụ: xây dựng các API trong thử nghiệm)
RequestJS - Nó phổ biến, đơn giản và giải quyết được 1-3, nhưng thiếu phạm vi là một sự phá vỡ thỏa thuận thực sự (tôi tin rằng head.js tương tự ở chỗ nó thiếu phạm vi, mặc dù tôi chưa bao giờ có dịp sử dụng nó. Tương tự như vậy, LABj có thể tải và
.wait()
thực hiện các vấn đề phụ thuộc một cách đơn giản, nhưng nó vẫn không thực hiện phạm vi)
Theo như tôi có thể nói, dường như có nhiều giải pháp để tải javascript động và / hoặc không đồng bộ, nhưng chúng có xu hướng gặp phải các vấn đề về phạm vi giống như chỉ tải j từ HTML. Hơn bất cứ điều gì khác, tôi muốn một cách để tải javascript hoàn toàn không gây ô nhiễm không gian tên chung, nhưng vẫn cho phép tôi tải và sử dụng các thư viện (giống như yêu cầu của nút).
CẬP NHẬT NĂM 2020: Các mô-đun hiện là tiêu chuẩn trong ES6 và kể từ giữa năm 2020 được hầu hết các trình duyệt hỗ trợ . Mô-đun hỗ trợ cả tải đồng bộ và không đồng bộ (sử dụng Promise). Khuyến nghị hiện tại của tôi là hầu hết các dự án mới nên sử dụng mô-đun ES6 và sử dụng trình chuyển tiếp để chuyển về một tệp JS duy nhất cho các trình duyệt cũ.
Theo nguyên tắc chung, băng thông ngày nay cũng thường rộng hơn nhiều so với khi tôi hỏi câu hỏi này ban đầu. Vì vậy, trong thực tế, bạn có thể chọn một cách hợp lý để luôn sử dụng một bộ chuyển tiếp với các mô-đun ES6 và tập trung nỗ lực của bạn vào hiệu quả mã hơn là mạng.
CHỈNH SỬA TRƯỚC (hoặc nếu bạn không thích mô-đun ES6): Kể từ khi viết bài này, tôi đã sử dụng rộng rãi RequestJS (hiện đã có tài liệu rõ ràng hơn nhiều). Yêu cầuJS thực sự là sự lựa chọn đúng đắn theo ý kiến của tôi. Tôi muốn làm rõ cách thức hoạt động của hệ thống đối với những người đang bối rối như tôi:
Bạn có thể sử dụng require
trong phát triển hàng ngày. Một mô-đun có thể là bất kỳ thứ gì được trả về bởi một hàm (thường là một đối tượng hoặc một hàm) và được xác định phạm vi như một tham số. Bạn cũng có thể biên dịch dự án của mình thành một tệp duy nhất để triển khai bằng cách sử dụng r.js
(trong thực tế, điều này hầu như luôn nhanh hơn, mặc dù require
có thể tải các tập lệnh song song).
Sự khác biệt cơ bản giữa RequestJS và yêu cầu kiểu nút như Browserify (một dự án thú vị do tjameson đề xuất) sử dụng là cách các mô-đun được thiết kế và yêu cầu:
- RequestJS sử dụng AMD (Định nghĩa mô-đun không đồng bộ). Trong AMD,
require
lấy một danh sách các mô-đun (tệp javascript) để tải và một hàm gọi lại. Khi nó đã tải từng mô-đun, nó sẽ gọi lệnh gọi lại với mỗi mô-đun như một tham số cho lệnh gọi lại. Do đó, nó thực sự không đồng bộ và do đó rất phù hợp với web. - Node sử dụng CommonJS. Trong CommonJS,
require
là một lệnh gọi chặn tải một mô-đun và trả về nó dưới dạng một đối tượng. Điều này hoạt động tốt cho Node vì các tệp được đọc khỏi hệ thống tệp, hệ thống này đủ nhanh, nhưng hoạt động kém trên web vì tải tệp đồng bộ có thể mất nhiều thời gian hơn.
Trong thực tế, nhiều nhà phát triển đã sử dụng Node (và do đó là CommonJS) trước khi họ thấy AMD. Ngoài ra, nhiều thư viện / mô-đun được viết cho CommonJS (bằng cách thêm mọi thứ vào một exports
đối tượng) chứ không phải cho AMD (bằng cách trả lại mô-đun từ define
hàm). Do đó, rất nhiều nhà phát triển Node-quay-web muốn sử dụng thư viện CommonJS trên web. Điều này có thể thực hiện được vì việc tải từ <script>
thẻ đang bị chặn. Các giải pháp như Browserify lấy các mô-đun CommonJS (Node) và gói chúng lại để bạn có thể bao gồm chúng bằng các thẻ script.
Do đó, nếu bạn đang phát triển dự án nhiều tệp của riêng mình cho web, tôi thực sự khuyên bạn nên dùng RequestJS, vì nó thực sự là một hệ thống mô-đun cho web (mặc dù công bằng mà nói, tôi thấy AMD tự nhiên hơn CommonJS nhiều). Gần đây, sự khác biệt đã trở nên ít quan trọng hơn, vì bây giờ RequestJS cho phép bạn sử dụng cú pháp CommonJS về cơ bản. Ngoài ra, RequestJS có thể được sử dụng để tải các mô-đun AMD trong Node (mặc dù tôi thích node-amd-loader hơn ).