Bower init - sự khác biệt giữa amd, es6, toàn cầu và nút


291

Tôi đang tạo thành phần Bower đầu tiên của tôi. Sau khi chạy bower inittập lệnh, hãy hỏi tôi 'loại mô-đun nào gói này lộ ra?' với các tùy chọn sau:

  • amd
  • es6
  • toàn cầu
  • nút

sự khác biệt giữa các tùy chọn này là gì?

Câu trả lời:


121

Nếu bạn không biết, rất có thể toàn cầu là câu trả lời phù hợp với bạn.

Dù bằng cách nào, bạn cần hiểu:

[CẬP NHẬT]

Tính năng này đã được giới thiệu rất gần đây trong Bower và chưa được ghi nhận (AFAIK). Về cơ bản moduleType, nó mô tả , trong đó nêu rõ công nghệ mô-đun mà gói được sử dụng là gì (xem ở trên).

Ngay bây giờ, nó không có bất kỳ ảnh hưởng nào ngoài việc đặt thuộc moduleTypetính trong bower.jsontệp của gói.

Xem https://github.com/bower/bower/pull/934 để biết yêu cầu kéo ban đầu.

[CẬP NHẬT # 2]

Một vài điểm bổ sung, để trả lời bình luận:

  • ngay bây giờ AFAIK không có xác nhận được thực hiện trên moduleTypetài sản - điều đó có nghĩa là mọi người về mặt kỹ thuật được phép sử dụng bất kỳ giá trị nào họ muốn cho nó, bao gồm cả angularjsnếu họ cảm thấy có xu hướng làm như vậy
  • các ủy ban Chòi chơi dường như không được quan tâm đối với sự bao gồm của thêm non-interoperable/proprietary moduleTypes(nghĩ nhà soạn nhạc, góc cạnh, vv) - đó là dễ hiểu, nhưng một lần nữa, không có gì thực sự ngăn chặn người sử dụng các moduleTypegiá trị mà họ muốn
  • một ngoại lệ trước đây là sự bao gồm (phần nào) gần đây của yui moduleType, vì vậy, có những "ngoại lệ" được đưa ra, giả sử chúng là một phần của kế hoạch phối hợp

Tôi sẽ làm gì nếu tôi là tác giả của một gói cho người quản lý gói không được liệt kê và xuất bản nó trên Bower?

Tôi sẽ tạo ra một mô-đun es6 và sử dụng / vá es6-transpiler để xuất định dạng gói tôi cần. Sau đó, tôi sẽ / và:

  • kiến nghị các anh chàng bower bao gồm công nghệ gói của tôi như một sự lựa chọn (dựa trên thực tế nó được hỗ trợ bởi es6-transpiler làm mục tiêu)
  • xuất bản gói của tôi bao gồm cả phiên bản mô-đun es6 của nó và phiên bản XXX được phiên mã của gói đó và sử dụng es6làm phiên bảnmoduleType

Tuyên bố miễn trừ trách nhiệm: Tôi không có kinh nghiệm thực tế về các mô-đun angularjs.


4
toàn cầu sẽ là câu trả lời đúng cho việc tạo ra một mô-đun / gói AngularJS?

1
Tôi đã cập nhật bài đăng của mình với những suy nghĩ bổ sung về câu hỏi "phải làm gì với người quản lý gói không được hỗ trợ" - một lần nữa, lĩnh vực này không bắt buộc hoặc được sử dụng cho bất cứ điều gì ngay bây giờ - giá trị của nó chỉ mang tính thông tin. Về phần angularjsmình, tôi có thể sử dụng globals, vâng, nhưng đọc bản cập nhật của tôi. Mong rằng sẽ giúp.
Mangled Deutz

Tôi đang sử dụng nút. Điều đó có nghĩa là tôi đang phơi bày các mô-đun nút? Tôi cũng đang sử dụng angular, đó là những gì tôi đã cài đặt bằng bower khi tôi nhận thấy rằng tôi có một thông báo cho tôi biết rằng tôi không có "tập tin bower.json để lưu vào, sử dụng bower init để tạo một". (Hoặc, nếu đây là một câu hỏi riêng biệt, tôi có thể viết một câu hỏi. Tôi nghĩ có lẽ đây là một nhận xét thích hợp để đặt ở đây vì nó liên quan đến câu trả lời của bạn. Cảm ơn!)
PrairieProf

27

Ban đầu

Tôi cũng đang sử dụng bower initlần đầu tiên.

Các tùy chọn nên tham khảo các cách khác nhau để mô đun hóa một số mã JavaScript:

  • amd: sử dụng AMD define, như requestjs.
  • nút: sử dụng Node.js require.
  • toàn cầu: sử dụng mẫu mô-đun JavaScript để hiển thị một biến toàn cục (như window.JQuery).
  • es6: sử dụng tính năng mô-đun EcmaScript6 sắp tới.

Trong trường hợp của tôi, tôi đã viết một module Node.js dflow nhưng tôi đang sử dụng browserify để tạo ra một dist / dflow.js tập tin đó xuất khẩu một toàn cầu dflow var: vì vậy tôi chọn globals .

Cập nhật khác

Lệnh tôi đã sử dụng để trình duyệt luồng như một đối tượng toàn cầu của cửa sổ

browserify -s dflow -e index.js -o dist/dflow.js

Tôi đã thay đổi vì tôi thích sử dụng yêu cầu bên trong trình duyệt, vì vậy bây giờ tôi đang sử dụng

browserify -r ./index.js:dflow -o dist/dflow.js

và vì vậy tôi đã thay đổi bower.moduleType thành nút trong tệp bower.json của mình .

Động lực chính là nếu tên mô-đun của tôi có một dấu gạch ngang, ví dụ dự án của tôi dòng chảy-view , tôi cần phải camelize tên toàn cầu trong flowView .

Cách tiếp cận mới này có hai lợi ích khác:

  1. Nút và giao diện trình duyệt giống nhau. Sử dụng yêu cầu ở cả phía máy khách và phía máy chủ, hãy để tôi chỉ viết một lần ví dụ mã và sử dụng lại chúng dễ dàng trên cả hai bối cảnh.
  2. Tôi sử dụng các tập lệnh npm và vì vậy, tôi có thể tận dụng ${npm_package_name}biến và viết một khi tập lệnh tôi sử dụng để trình duyệt.

Đây là một chủ đề khác, nhưng, nó thực sự đáng để bạn xem xét nó hữu ích như thế nào về lợi ích sau: hãy để tôi chia sẻ npm.scripts.browserifythuộc tính tôi sử dụng trong gói.json của mình

"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"


1
bạn thực sự có thể sử dụng yêu cầu bên trong định nghĩa cho ví dụ: define(function(require, exports, module) { "use strict"; module.exports = { Collection: require("./collection"), View: require('./view') }; });
Doron Segal

7

Chỉ để tham khảo, đây chính xác là những gì Bower chỉ định liên quan đến các loại mô-đun:

Loại mô-đun được xác định trong maintệp JavaScript. Có thể là một hoặc một mảng của các chuỗi sau:

  • globals: Mô-đun JavaScript thêm vào không gian tên toàn cầu, sử dụng window.namespacehoặc this.namespacecú pháp
  • amd: Mô-đun JavaScript tương thích với AMD, như RequireJS , sử dụng define()cú pháp
  • node: Mô-đun JavaScript tương thích với nútCommonJS bằng module.exportscú pháp
  • es6: Mô-đun JavaScript tương thích với các mô-đun ECMAScript 6 , sử dụng exportimportcú pháp
  • yui: Mô-đun JavaScript tương thích với Mô-đun YUI , sử dụng YUI.add()cú pháp

Liên kết có liên quan: https://github.com/bower/spec/blob/master/json.md#moduletype

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.