NPM so với Bower so với Browserify so với Gulp so với Grunt so với Webpack


1886

Tôi đang cố gắng tóm tắt kiến ​​thức của mình về các trình quản lý, gói và trình chạy gói JavaScript phổ biến nhất. Vui long sửa cho tôi nêu tôi sai:

  • npm& bowerlà người quản lý gói. Họ chỉ tải xuống các phụ thuộc và không biết cách tự xây dựng các dự án. Những gì họ biết là gọi webpack/ gulp/ gruntsau khi tìm nạp tất cả các phụ thuộc.
  • bowerlà như thế npm, nhưng xây dựng một cây phụ thuộc phẳng (không giống như npmnó đệ quy). Có nghĩa là npmtìm nạp các phụ thuộc cho từng phụ thuộc (có thể tìm nạp cùng một vài lần), trong khi bowerhy vọng bạn sẽ bao gồm các phụ thuộc phụ theo cách thủ công. Đôi khi bowernpmđược sử dụng cùng nhau cho front-end và back-end (vì mỗi megabyte có thể quan trọng ở front-end).
  • gruntgulplà những người chạy nhiệm vụ để tự động hóa mọi thứ có thể được tự động hóa (tức là biên dịch CSS / Sass, tối ưu hóa hình ảnh, tạo một gói và thu nhỏ / dịch mã nó).
  • gruntvs. gulp(giống như mavenvs. gradlehoặc cấu hình so với mã). Grunt dựa trên cấu hình các tác vụ độc lập riêng biệt, mỗi tác vụ sẽ mở / xử lý / đóng tệp. Gulp yêu cầu số lượng mã ít hơn và dựa trên các luồng Node, cho phép nó xây dựng các chuỗi ống (không mở lại cùng một tệp) và làm cho nó nhanh hơn.
  • webpack( webpack-dev-server) - đối với tôi, đó là trình chạy tác vụ với tải lại các thay đổi nóng cho phép bạn quên đi tất cả các trình theo dõi JS / CSS.
  • npm/ bower+ plugin có thể thay thế người chạy nhiệm vụ. Khả năng của chúng thường giao nhau nên có những hàm ý khác nhau nếu bạn cần sử dụng gulp/ grunthơn npm+ plugin. Nhưng các trình chạy tác vụ chắc chắn tốt hơn cho các tác vụ phức tạp (ví dụ: "trên mỗi gói tạo, chuyển mã từ ES6 sang ES5, chạy nó ở tất cả các trình giả lập trình duyệt, tạo ảnh chụp màn hình và triển khai để thả hộp qua ftp").
  • browserifycho phép đóng gói các mô-đun nút cho trình duyệt. browserifyvs node's requirethực sự là AMD vs CommonJS .

Câu hỏi:

  1. Là gì webpack& webpack-dev-server? Tài liệu chính thức nói rằng đó là một gói mô-đun nhưng đối với tôi nó chỉ là một trình chạy tác vụ. Có gì khác biệt?
  2. Bạn sẽ sử dụng ở browserifyđâu? Chúng ta có thể làm tương tự với nhập khẩu nút / ES6 không?
  3. Khi nào bạn sẽ sử dụng gulp/ grunthơn npm+ plugin?
  4. Vui lòng cung cấp các ví dụ khi bạn cần sử dụng kết hợp

52
Thời gian để thêm vào rollup ? 😝
GMAN

167
đây là một câu hỏi rất hợp lý các nhà phát triển web giả như tôi vấp ngã trên tất cả các gói được triển khai hàng tuần ..
Simon Dirmeier


41
@Fisherman Tôi hoàn toàn mới với điều này, và có vẻ như hoàn toàn ...
David Stosik

13
@Fisherman Bình luận "được đề nghị" tôi vừa đọc thậm chí còn tệ hơn! Trả lời / Ngón tay Ctrl-V, và điều đó thật hoàn hảo ... Tuy nhiên, hàng giờ trôi qua, vẫn cố gắng tìm cách đi ...
David Stosik

Câu trả lời:


1028

Webpack và Browserify

Webpack và Browserify thực hiện khá nhiều công việc tương tự, đó là xử lý mã của bạn sẽ được sử dụng trong môi trường đích (chủ yếu là trình duyệt, mặc dù bạn có thể nhắm mục tiêu các môi trường khác như Node). Kết quả của việc xử lý như vậy là một hoặc nhiều gói - tập lệnh được lắp ráp phù hợp với môi trường được nhắm mục tiêu.

Ví dụ: giả sử bạn đã viết mã ES6 được chia thành các mô-đun và muốn có thể chạy nó trong trình duyệt. Nếu các mô-đun đó là mô-đun Node, trình duyệt sẽ không hiểu chúng vì chúng chỉ tồn tại trong môi trường Nút. Các mô-đun ES6 cũng sẽ không hoạt động trong các trình duyệt cũ hơn như IE11. Hơn nữa, bạn có thể đã sử dụng các tính năng ngôn ngữ thử nghiệm (các đề xuất tiếp theo của ES) mà các trình duyệt chưa triển khai nên việc chạy tập lệnh như vậy sẽ gây ra lỗi. Các công cụ như Webpack và Browserify giải quyết các vấn đề này bằng cách dịch mã đó sang dạng trình duyệt có thể thực thi . Trên hết, họ làm cho nó có thể áp dụng rất nhiều tối ưu hóa trên các gói đó.

Tuy nhiên, Webpack và Browserify khác nhau theo nhiều cách, Webpack cung cấp nhiều công cụ theo mặc định (ví dụ: tách mã), trong khi Browserify chỉ có thể làm điều này sau khi tải xuống plugin nhưng sử dụng cả hai dẫn đến kết quả rất giống nhau . Nó tùy thuộc vào sở thích cá nhân (Webpack là xu hướng). Btw, Webpack không phải là một trình chạy tác vụ, nó chỉ là bộ xử lý các tệp của bạn (nó xử lý chúng bằng cái gọi là trình tải và plugin) và nó có thể được chạy (trong các cách khác) bởi một trình chạy tác vụ.


Webpack Dev Server

Webpack Dev Server cung cấp một giải pháp tương tự cho Browseersync - một máy chủ phát triển nơi bạn có thể triển khai ứng dụng của mình một cách nhanh chóng khi bạn đang làm việc với nó và xác minh tiến trình phát triển của bạn ngay lập tức, với máy chủ dev tự động làm mới trình duyệt khi thay đổi mã hoặc thậm chí truyền mã đã thay đổi vào trình duyệt mà không cần tải lại với cái gọi là thay thế mô-đun nóng.


Tác vụ chạy so với kịch bản NPM

Tôi đã sử dụng Gulp vì tính đơn giản và cách viết nhiệm vụ dễ dàng, nhưng sau đó tôi phát hiện ra rằng tôi không cần Gulp hay Grunt. Mọi thứ tôi cần có thể được thực hiện bằng cách sử dụng tập lệnh NPM để chạy các công cụ của bên thứ 3 thông qua API của họ. Lựa chọn giữa các kịch bản Gulp, Grunt hoặc NPM phụ thuộc vào sở thích và kinh nghiệm của nhóm của bạn.

Mặc dù các tác vụ trong Gulp hoặc Grunt rất dễ đọc ngay cả đối với những người không quen thuộc với JS, nhưng đây là một công cụ khác để yêu cầu và học hỏi và cá nhân tôi thích thu hẹp sự phụ thuộc của mình và làm cho mọi thứ trở nên đơn giản. Mặt khác, việc thay thế các tác vụ này bằng sự kết hợp của các tập lệnh NPM và tập lệnh (có thể là JS) chạy các công cụ của bên thứ 3 đó (ví dụ: Cấu hình tập lệnh nút và chạy rimraf cho mục đích làm sạch) có thể khó khăn hơn. Nhưng trong phần lớn các trường hợp, ba người đó đều bình đẳng về kết quả của họ.


Ví dụ

Về các ví dụ, tôi khuyên bạn nên xem dự án khởi động React này , nó cho bạn thấy một sự kết hợp tốt đẹp giữa các tập lệnh NPM và JS bao gồm toàn bộ quá trình xây dựng và triển khai. Bạn có thể tìm thấy các tập lệnh NPM đó trong package.jsonthư mục gốc, trong một thuộc tính có tên scripts. Ở đó bạn sẽ gặp hầu hết các lệnh như thế nào babel-node tools/run start. Nút Babel là một công cụ CLI (không có nghĩa là để sử dụng sản xuất), lúc đầu biên dịch tệp tools/runES6 (tệp run.js nằm trong các công cụ ) - về cơ bản là một tiện ích chạy. Người chạy này lấy một hàm làm đối số và thực thi nó, trong trường hợp này là start- một tiện ích khác (start.js) chịu trách nhiệm gói các tệp nguồn (cả máy khách và máy chủ) và khởi động ứng dụng và máy chủ phát triển (máy chủ dev có thể là Webpack Dev Server hoặc Browseersync).

Nói chính xác hơn, start.jstạo các gói phía máy khách và máy chủ, khởi động máy chủ tốc hành và sau khi khởi chạy thành công, khởi chạy Đồng bộ hóa trình duyệt, tại thời điểm viết giống như thế này (vui lòng tham khảo dự án khởi động cho mã mới nhất).

const bs = Browsersync.create();  
bs.init({
      ...(DEBUG ? {} : { notify: false, ui: false }),

      proxy: {
        target: host,
        middleware: [wpMiddleware, ...hotMiddlewares],
      },

      // no need to watch '*.js' here, webpack will take care of it for us,
      // including full page reloads if HMR won't work
      files: ['build/content/**/*.*'],
}, resolve)

Phần quan trọng là proxy.target, nơi họ đặt địa chỉ máy chủ mà họ muốn ủy quyền, có thể là http: // localhost: 3000 và Browseersync bắt đầu một máy chủ lắng nghe trên http: // localhost: 3001 , trong đó các tài sản được tạo được cung cấp với thay đổi tự động phát hiện và thay thế mô-đun nóng. Như bạn có thể thấy, có một thuộc tính cấu hình khác filesvới các tệp hoặc mẫu riêng lẻ Đồng hồ hóa trình duyệt để thay đổi và tải lại trình duyệt nếu xảy ra, nhưng như nhận xét, Webpack tự chăm sóc xem các nguồn js với HMR, vì vậy họ hợp tác ở đó

Bây giờ tôi không có bất kỳ ví dụ tương đương nào về cấu hình Grunt hoặc Gulp như vậy, nhưng với Gulp (và hơi giống với Grunt), bạn sẽ viết các tác vụ riêng lẻ trong gulpfile.js như

gulp.task('bundle', function() {
  // bundling source files with some gulp plugins like gulp-webpack maybe
});

gulp.task('start', function() {
  // starting server and stuff
});

nơi bạn sẽ làm về cơ bản khá nhiều thứ tương tự như trong bộ khởi động, lần này với trình chạy tác vụ, giải quyết một số vấn đề cho bạn, nhưng đưa ra các vấn đề riêng và một số khó khăn trong quá trình học cách sử dụng, và như tôi nói, bạn càng có nhiều phụ thuộc, càng có thể đi sai. Và đó là lý do tôi thích loại bỏ các công cụ như vậy.


3
câu trả lời chính xác! Bạn có thể mô tả xin vui lòng theo cách webpack / browserify quản lý các mô-đun nút tái sử dụng tại trình duyệt không?
VB_

4
Webpack tập hợp các phụ thuộc (giá trị mô-đun xuất) vào đối tượng (installModules). Do đó, mỗi mô-đun là thuộc tính của đối tượng đó và tên của thuộc tính đó đại diện cho id của nó (ví dụ: 1, 2, 3 ... vv). Mỗi khi bạn yêu cầu mô-đun như vậy trong nguồn của mình, webpack sẽ chuyển đổi giá trị thành lệnh gọi hàm với id mô-đun trong đối số (ví dụ: __webpack_Vquire __ (1)), trả về sự phụ thuộc đúng dựa trên tìm kiếm trong installModules theo id mô-đun. Tôi không chắc chắn, làm thế nào Browserify xử lý nó.
Dan Macák

@Dan Skočdopole Bạn có thể nói rõ hơn không?
Asim KT

1
Tôi không đồng ý với việc trình bày cách sử dụng cơ bản của gulp hoặc grunt, hai cái này dễ so sánh bằng cách sử dụng google, webpack-dev-server yêu cầu hiểu webpack trước, và đó là ngoài phạm vi của câu hỏi / câu trả lời này, nhưng tôi đã trình bày một số cấu hình Browseersync. Bạn đúng với bộ khởi động, và tôi đã xây dựng nó nhiều hơn.
Dan Macák

5
+1 để giảm sự phụ thuộc để giữ mọi thứ đơn giản thay vì tuân theo ý kiến ​​phổ biến (hơn) rằng mọi gói mới phải được sử dụng!
madannes

675

Cập nhật tháng 10 năm 2018

Nếu bạn vẫn chưa chắc chắn về Front-end dev, có thể xem nhanh một tài nguyên tuyệt vời ở đây.

https://github.com/kamranahmedse/developer-roadmap

Cập nhật tháng 6 năm 2018

Học JavaScript hiện đại là khó khăn nếu bạn không có mặt từ đầu. Nếu bạn là người mới đến, hãy nhớ kiểm tra văn bản xuất sắc này để có cái nhìn tổng quan hơn.

https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70

Cập nhật tháng 7 năm 2017

Gần đây tôi đã tìm thấy một hướng dẫn thực sự toàn diện từ nhóm Grab về cách tiếp cận phát triển front-end vào năm 2017. Bạn có thể xem qua như dưới đây.

https://github.com/grab/front-end-guide


Tôi cũng đã tìm kiếm điều này khá lâu vì có rất nhiều công cụ và mỗi công cụ này mang lại lợi ích cho chúng tôi ở một khía cạnh khác nhau. Cộng đồng được chia thành các công cụ như thế nào Browserify, Webpack, jspm, Grunt and Gulp. Bạn cũng có thể nghe về Yeoman or Slush. Đó thực sự không phải là một vấn đề, nó chỉ gây nhầm lẫn cho mọi người đang cố gắng hiểu một con đường rõ ràng phía trước.

Dù sao, tôi muốn đóng góp một cái gì đó.

1. Quản lý gói

Trình quản lý gói đơn giản hóa việc cài đặt và cập nhật các phụ thuộc của dự án, đó là các thư viện như : jQuery, Bootstrap, v.v. - mọi thứ được sử dụng trên trang web của bạn và không được viết bởi bạn.

Duyệt tất cả các trang web thư viện, tải xuống và giải nén tài liệu lưu trữ, sao chép tệp vào các dự án - tất cả điều này được thay thế bằng một vài lệnh trong thiết bị đầu cuối.

  • NPMlà viết tắt của: Node JS package managergiúp bạn quản lý tất cả các thư viện mà phần mềm của bạn dựa vào. Bạn sẽ xác định nhu cầu của mình trong một tệp được gọi package.jsonvà chạy npm installtrong dòng lệnh ... sau đó BANG, các gói của bạn đã được tải xuống và sẵn sàng để sử dụng. Có thể được sử dụng cả cho front-end and back-endcác thư viện.

  • Bower: đối với quản lý gói front-end, khái niệm này giống với NPM. Tất cả các thư viện của bạn được lưu trữ trong một tệp có tên bower.jsonvà sau đó chạy bower installtrong dòng lệnh.

Sự khác biệt lớn nhất giữa BowerNPMlà NPM không có cây phụ thuộc lồng nhau trong khi Bower yêu cầu cây phụ thuộc phẳng như bên dưới.

Trích dẫn từ sự khác biệt giữa Bower và npm là gì?

NPM

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

Cung cấp

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

Có một số cập nhật trên npm 3 Duplication and Deduplication, xin vui lòng mở tài liệu để biết thêm chi tiết.

  • Yarn: Một quản lý gói mới cho JavaScript công bố bởi Facebookthời gian gần đây với một số ưu điểm hơn so với NPM. Và với Sợi, bạn vẫn có thể sử dụng cả hai NPMBowerđăng ký để lấy gói. Nếu bạn đã cài đặt một gói trước đó, hãy yarntạo một bản sao được lưu trong bộ nhớ cache để tạo điều kiện offline package installs.

  • jspm: là trình quản lý gói cho SystemJStrình tải mô-đun phổ quát, được xây dựng bên trên ES6trình tải mô-đun động. Nó không phải là một trình quản lý gói hoàn toàn mới với bộ quy tắc riêng của nó, thay vào đó nó hoạt động dựa trên các nguồn gói hiện có. Ra khỏi hộp, nó hoạt động với GitHubnpm. Vì hầu hết các Bowergói dựa trên GitHub, chúng tôi cũng có thể cài đặt các gói đó bằng cách sử dụng jspm. Nó có một sổ đăng ký liệt kê hầu hết các gói front-end thường được sử dụng để cài đặt dễ dàng hơn.

Xem sự khác nhau giữa Bowerjspm: Trình quản lý gói: Bower vs jspm


2. Bộ nạp / Gói mô-đun

Hầu hết các dự án ở bất kỳ quy mô nào cũng sẽ có mã của chúng được phân chia giữa một số tệp. <script>Tuy nhiên, bạn chỉ có thể bao gồm mỗi tệp với một thẻ riêng lẻ , <script>thiết lập kết nối http mới và cho các tệp nhỏ - đó là mục tiêu của mô đun hóa - thời gian để thiết lập kết nối có thể mất nhiều thời gian hơn so với truyền dữ liệu. Trong khi các tập lệnh đang tải xuống, không có nội dung nào có thể thay đổi trên trang.

  • Vấn đề về thời gian tải xuống phần lớn có thể được giải quyết bằng cách ghép một nhóm các mô-đun đơn giản thành một tệp duy nhất và thu nhỏ nó.

Ví dụ

<head>
    <title>Wagon</title>
    <script src=“build/wagon-bundle.js”></script>
</head>
  • Hiệu suất đi kèm với chi phí của sự linh hoạt mặc dù. Nếu các mô-đun của bạn có sự phụ thuộc lẫn nhau, sự thiếu linh hoạt này có thể là một trình diễn.

Ví dụ

<head>
    <title>Skateboard</title>
    <script src=“connectors/axle.js”></script>
    <script src=“frames/board.js”></script>
    <!-- skateboard-wheel and ball-bearing both depend on abstract-rolling-thing -->
    <script src=“rolling-things/abstract-rolling-thing.js”></script>
    <script src=“rolling-things/wheels/skateboard-wheel.js”></script>
    <!-- but if skateboard-wheel also depends on ball-bearing -->
    <!-- then having this script tag here could cause a problem -->
    <script src=“rolling-things/ball-bearing.js”></script>
    <!-- connect wheels to axle and axle to frame -->
    <script src=“vehicles/skateboard/our-sk8bd-init.js”></script>
</head>

Máy tính có thể làm điều đó tốt hơn bạn có thể, và đó là lý do tại sao bạn nên sử dụng một công cụ để tự động gói mọi thứ vào một tệp.

Sau đó chúng tôi nghe về RequireJS, Browserify, WebpackSystemJS

  • RequireJS: là một JavaScripttrình tải tập tin và mô-đun. Nó được tối ưu hóa để sử dụng trong trình duyệt, nhưng nó có thể được sử dụng trong các môi trường JavaScript khác, như Node.

Ví dụ: myModule.js

// package/lib is a dependency we require
define(["package/lib"], function (lib) {

    // behavior for our module
    function foo() {
        lib.log( "hello world!" );
    }

    // export (expose) foo to other modules as foobar
    return {
        foobar: foo
    }
});

Trong main.js, chúng ta có thể nhập myModule.jsdưới dạng phụ thuộc và sử dụng nó.

require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

Và sau đó trong chúng ta HTML, chúng ta có thể tham khảo để sử dụng với RequireJS.

<script src=“app/require.js data-main=“main.js ></script>

Đọc thêm về CommonJSAMDđể có được sự hiểu biết dễ dàng. Mối quan hệ giữa CommonJS, AMD và RequireJS?

  • Browserify: đặt ra để cho phép sử dụng các CommonJSmô-đun được định dạng trong trình duyệt. Do đó, Browserifykhông phải là trình tải mô-đun nhiều như trình đóng gói mô-đun: Browserifyhoàn toàn là một công cụ thời gian xây dựng, tạo ra một bó mã mà sau đó có thể được tải phía máy khách.

Bắt đầu với một máy xây dựng có cài đặt nút & npm và nhận gói:

npm install -g save-dev browserify

Viết mô-đun của bạn ở CommonJSđịnh dạng

//entry-point.js
var foo = require('../foo.js');
console.log(foo(4));

Và khi hạnh phúc, hãy ra lệnh để bó:

browserify entry-point.js -o bundle-name.js

Browserify đệ quy tìm tất cả các phụ thuộc của điểm đầu vào và tập hợp chúng thành một tệp duy nhất:

<script src=”bundle-name.js”></script>
  • Webpack: Nó gói tất cả các tài sản tĩnh của bạn, bao gồm JavaScript, hình ảnh, CSS và hơn thế nữa vào một tệp duy nhất. Nó cũng cho phép bạn xử lý các tệp thông qua các loại trình tải khác nhau. Bạn có thể viết cú pháp của bạn JavaScriptvới CommonJShoặc AMDmô-đun. Nó tấn công vấn đề xây dựng theo cách tích hợp và có nhiều ý kiến ​​hơn. Trong Browserifybạn sử dụng Gulp/Gruntvà một danh sách dài các biến đổi và plugin để hoàn thành công việc. Webpackcung cấp đủ năng lượng ra khỏi hộp mà bạn thường không cần Grunthoặc hoàn Gulptoàn không có.

Sử dụng cơ bản là vượt quá đơn giản. Cài đặt Webpack như Browserify:

npm install -g save-dev webpack

Và truyền lệnh một điểm vào và một tệp đầu ra:

webpack ./entry-point.js bundle-name.js
  • SystemJS: là trình tải mô-đun có thể nhập mô-đun vào thời gian chạy ở bất kỳ định dạng phổ biến nào được sử dụng hiện nay ( CommonJS, UMD, AMD, ES6). Nó được xây dựng trên đỉnh của ES6bộ nạp đa mô-đun và đủ thông minh để phát hiện định dạng đang được sử dụng và xử lý nó một cách thích hợp. SystemJScũng có thể dịch mã ES6 (có Babelhoặc Traceur) hoặc các ngôn ngữ khác như TypeScriptCoffeeScriptsử dụng plugin.

Muốn biết cái gì là node modulevà tại sao nó không thích nghi tốt với trình duyệt.

Bài viết hữu ích hơn:


Tại sao jspmSystemJS?

Một trong những mục tiêu chính của ES6mô đun là để làm cho nó thực sự đơn giản để cài đặt và sử dụng bất kỳ thư viện Javascript từ bất cứ nơi nào trên Internet ( Github, npm, vv). Chỉ có hai điều cần thiết:

  • Một lệnh duy nhất để cài đặt thư viện
  • Một dòng mã duy nhất để nhập thư viện và sử dụng nó

Vì vậy, với jspm, bạn có thể làm điều đó.

  1. Cài đặt thư viện bằng lệnh: jspm install jquery
  2. Nhập thư viện với một dòng mã, không cần tham chiếu bên ngoài trong tệp HTML của bạn.

display.js

var $ = require('jquery'); 

$('body').append("I've imported jQuery!");
  1. Sau đó, bạn định cấu hình những thứ này trong System.config({ ... })trước khi nhập mô-đun của bạn. Thông thường khi chạy jspm init, sẽ có một tệp có tên config.jscho mục đích này.

  2. Để làm cho các tập lệnh này chạy, chúng ta cần tải system.jsconfig.jstrên trang HTML. Sau đó, chúng tôi sẽ tải display.jstập tin bằng cách sử dụng SystemJStrình tải mô-đun.

index.html

<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
  System.import("scripts/display.js");
</script>

Lưu ý: Bạn cũng có thể sử dụng npmvới WebpackAngular 2 đã áp dụng nó. Vì jspmđược phát triển để tích hợp với SystemJSvà nó hoạt động dựa trên npmnguồn hiện có , vì vậy câu trả lời của bạn là tùy thuộc vào bạn.


3. Nhiệm vụ chạy

Người chạy tác vụ và công cụ xây dựng chủ yếu là các công cụ dòng lệnh. Tại sao chúng ta cần sử dụng chúng: Trong một từ: tự động hóa . Bạn càng phải làm ít việc hơn khi thực hiện các tác vụ lặp đi lặp lại như thu nhỏ , biên dịch, kiểm tra đơn vị, điều mà trước đây chúng ta tốn rất nhiều thời gian để thực hiện với dòng lệnh hoặc thậm chí là thủ công.

  • Grunt: Bạn có thể tạo tự động hóa cho môi trường phát triển của mình để xử lý mã trước hoặc tạo tập lệnh xây dựng với tệp cấu hình và có vẻ rất khó xử lý một tác vụ phức tạp. Phổ biến trong vài năm qua.

Mỗi tác vụ trong Gruntlà một loạt các cấu hình plugin khác nhau, chỉ đơn giản là được thực thi lần lượt, theo cách thức độc lập và tuần tự nghiêm ngặt.

grunt.initConfig({
  clean: {
    src: ['build/app.js', 'build/vendor.js']
  },

  copy: {
    files: [{
      src: 'build/app.js',
      dest: 'build/dist/app.js'
    }]
  }

  concat: {
    'build/app.js': ['build/vendors.js', 'build/app.js']
  }

  // ... other task configurations ...

});

grunt.registerTask('build', ['clean', 'bower', 'browserify', 'concat', 'copy']);
  • Gulp: Tự động hóa giống như Gruntnhưng thay vì cấu hình, bạn có thể viết JavaScriptvới các luồng như là một ứng dụng nút. Thích những ngày này.

Đây là một Gulptuyên bố nhiệm vụ mẫu.

//import the necessary gulp plugins
var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCss = require('gulp-minify-css');
var rename = require('gulp-rename');

//declare the task
gulp.task('sass', function(done) {
  gulp.src('./scss/ionic.app.scss')
    .pipe(sass())
    .pipe(gulp.dest('./www/css/'))
    .pipe(minifyCss({
      keepSpecialComments: 0
    }))
    .pipe(rename({ extname: '.min.css' }))
    .pipe(gulp.dest('./www/css/'))
    .on('end', done);
});

Xem thêm: https://medium.com/@preslavrachev/gulp-vs-grunt-why-one-why-the-other-f5d3b398edc4#.fte0nahri


4. Dụng cụ giàn giáo

  • Slush and Yeoman: Bạn có thể tạo các dự án khởi động với chúng. Ví dụ: bạn đang dự định xây dựng một nguyên mẫu với HTML và SCSS, sau đó thay vì tự tạo một số thư mục như scss, css, img, phông chữ. Bạn chỉ có thể cài đặt yeomanvà chạy một kịch bản đơn giản. Sau đó, mọi thứ ở đây cho bạn.

Tìm thêm ở đây .

npm install -g yo
npm install --global generator-h5bp
yo h5bp

Xem thêm: https://www.quora.com/What-are-the-differences-b between-NPM-Bower-Grunt-Godp-Webpack-Browserify-Slush-Yeoman-and-Express


Câu trả lời của tôi không thực sự phù hợp với nội dung câu hỏi nhưng khi tôi tìm kiếm những kiến ​​thức này trên Google, tôi luôn thấy câu hỏi trên đầu để tôi quyết định trả lời tóm tắt. Hy vọng các bạn tìm thấy nó hữu ích.


64

OK, tất cả họ đều có một số điểm tương đồng, họ làm những điều tương tự cho bạn theo những cách khác nhau và tương tự nhau, tôi chia chúng thành 3 nhóm chính như sau:


1) Bộ đệm mô-đun

webpack và trình duyệt như những ứng dụng phổ biến, hoạt động như các trình chạy tác vụ nhưng với tính linh hoạt cao hơn, nó cũng sẽ kết hợp mọi thứ lại với nhau như cài đặt của bạn, vì vậy bạn có thể chỉ ra kết quả dưới dạng bundle.js trong một tệp duy nhất bao gồm CSS và Javascript, cho biết thêm chi tiết của từng loại, nhìn vào các chi tiết dưới đây:

gói web

webpack là một gói mô-đun cho các ứng dụng JavaScript hiện đại. Khi webpack xử lý ứng dụng của bạn, nó sẽ xây dựng đệ quy một biểu đồ phụ thuộc bao gồm mọi mô-đun mà ứng dụng của bạn cần, sau đó gói tất cả các mô-đun đó thành một số gói nhỏ - thường chỉ có một - được trình duyệt tải.

Nó có thể cấu hình đáng kinh ngạc, nhưng để bắt đầu, bạn chỉ cần hiểu Bốn khái niệm cốt lõi: mục nhập, đầu ra, bộ tải và plugin.

Tài liệu này nhằm cung cấp một cái nhìn tổng quan cấp cao về các khái niệm này, đồng thời cung cấp các liên kết đến các trường hợp sử dụng cụ thể khái niệm chi tiết.

thêm ở đây

trình duyệt

Browserify là một công cụ phát triển cho phép chúng ta viết các mô-đun kiểu node.js biên dịch để sử dụng trong trình duyệt. Giống như nút, chúng tôi viết các mô-đun của mình trong các tệp riêng biệt, xuất các phương thức và thuộc tính bên ngoài bằng cách sử dụng các biến module.exports và xuất. Chúng ta thậm chí có thể yêu cầu các mô-đun khác sử dụng hàm yêu cầu và nếu chúng ta bỏ qua đường dẫn tương đối, nó sẽ phân giải thành mô-đun trong thư mục node_modules.

thêm ở đây


2) Người chạy nhiệm vụ

gulp và grunt là những người chạy nhiệm vụ, về cơ bản là những gì họ làm, tạo ra các nhiệm vụ và chạy chúng bất cứ khi nào bạn muốn, ví dụ bạn cài đặt một plugin để thu nhỏ CSS của bạn và sau đó chạy nó mỗi lần để thực hiện thu nhỏ, chi tiết hơn về mỗi:

nuốt chửng

gulp.js là bộ công cụ JavaScript mã nguồn mở của Fractal Đổi mới và cộng đồng nguồn mở tại GitHub, được sử dụng làm hệ thống xây dựng phát trực tuyến trong phát triển web mặt trước. Nó là một trình chạy tác vụ được xây dựng trên Node.js và Trình quản lý gói Node (npm), được sử dụng để tự động hóa các tác vụ tốn thời gian và lặp đi lặp lại liên quan đến phát triển web như thu nhỏ, ghép nối, xóa bộ đệm, kiểm tra đơn vị, linting, tối ưu hóa, v.v. một cách tiếp cận cấu hình mã để xác định các nhiệm vụ của nó và dựa vào các plugin nhỏ, đơn mục đích để thực hiện chúng. hệ sinh thái gulp có hơn 1000 plugin như vậy được cung cấp để lựa chọn.

thêm ở đây

tiếng càu nhàu

Grunt là một trình chạy tác vụ JavaScript, một công cụ được sử dụng để tự động thực hiện các tác vụ được sử dụng thường xuyên như thu nhỏ, biên dịch, kiểm tra đơn vị, linting, v.v. Nó sử dụng giao diện dòng lệnh để chạy các tác vụ tùy chỉnh được xác định trong tệp (được gọi là Gruntfile) . Grunt được tạo bởi Ben Alman và được viết bằng Node.js. Nó được phân phối qua npm. Hiện tại, có hơn năm nghìn plugin có sẵn trong hệ sinh thái Grunt.

thêm ở đây


3) Quản lý gói

trình quản lý gói, những gì họ làm là quản lý các plugin bạn cần trong ứng dụng của bạn và cài đặt chúng cho bạn thông qua github, v.v. bằng cách sử dụng gói.json, rất tiện lợi để cập nhật các mô-đun, cài đặt chúng và chia sẻ ứng dụng của bạn, chi tiết hơn cho từng ứng dụng:

chiều

npm là trình quản lý gói cho ngôn ngữ lập trình JavaScript. Đây là trình quản lý gói mặc định cho môi trường thời gian chạy JavaScript Node.js. Nó bao gồm một máy khách dòng lệnh, còn được gọi là npm và cơ sở dữ liệu trực tuyến của các gói công khai, được gọi là đăng ký npm. Sổ đăng ký được truy cập thông qua ứng dụng khách và các gói có sẵn có thể được duyệt và tìm kiếm thông qua trang web npm.

thêm ở đây

bower

Bower có thể quản lý các thành phần có chứa HTML, CSS, JavaScript, phông chữ hoặc thậm chí các tệp hình ảnh. Bower không nối hoặc giảm mã hoặc làm bất cứ điều gì khác - nó chỉ cài đặt đúng phiên bản của các gói bạn cần và các phụ thuộc của chúng. Để bắt đầu, Bower hoạt động bằng cách tìm nạp và cài đặt các gói từ khắp nơi, chăm sóc săn bắn, tìm kiếm, tải xuống và lưu những thứ bạn đang tìm kiếm. Bower theo dõi các gói này trong một tệp kê khai, bower.json.

thêm ở đây

và trình quản lý gói gần đây nhất không nên bỏ qua, nó trẻ và nhanh trong môi trường làm việc thực tế so với npm mà tôi chủ yếu sử dụng trước đây, để cài đặt lại các mô-đun, nó kiểm tra kỹ thư mục node_modules để kiểm tra sự tồn tại của mô-đun, cũng có vẻ như việc cài đặt các mô-đun mất ít thời gian hơn:

sợi

Sợi là một trình quản lý gói cho mã của bạn. Nó cho phép bạn sử dụng và chia sẻ mã với các nhà phát triển khác từ khắp nơi trên thế giới. Sợi thực hiện việc này nhanh chóng, an toàn và đáng tin cậy để bạn không phải lo lắng.

Sợi cho phép bạn sử dụng các giải pháp của nhà phát triển khác cho các vấn đề khác nhau, giúp bạn dễ dàng phát triển phần mềm của mình hơn. Nếu bạn gặp sự cố, bạn có thể báo cáo sự cố hoặc đóng góp lại và khi sự cố được khắc phục, bạn có thể sử dụng Sợi để cập nhật tất cả.

Mã được chia sẻ thông qua một cái gì đó gọi là một gói (đôi khi được gọi là một mô-đun). Gói chứa tất cả mã được chia sẻ cũng như tệp pack.json mô tả gói.

thêm ở đây



Có một danh sách các plugin gulp? Có thực sự hơn 1000? npm chỉ trả về 20 hoặc hơn?
flurbius

1
Tóm tắt tuyệt vời. Nên là một điểm vào cho bất kỳ cuộc thảo luận về phát triển web hiện đại.
Adam Bubela

1
@flurbius Có, ở đây: gulpjs.com/plugins . Hiện tại dường như có 3.45 plugin Gulp.
mts knn

52

Bạn có thể tìm thấy một số so sánh kỹ thuật trên npmcompare

So sánh browserify so với grunt với gulp với webpack

Như bạn có thể thấy webpack được duy trì rất tốt với một phiên bản mới được phát hành trung bình cứ sau 4 ngày. Nhưng Gulp dường như có cộng đồng lớn nhất trong số họ (với hơn 20 nghìn sao trên Github) Grunt có vẻ hơi lơ là (so với những người khác)

Vì vậy, nếu cần chọn cái khác, tôi sẽ chọn Gulp


5
webpack hiện có 26k bắt đầu trên Github và gulp với 25,7k. Không thể sử dụng yếu tố phổ biến để quyết định nữa ...
Rayee Roded


14

Webpack & webpack-dev-server là gì? Tài liệu chính thức nói rằng đó là một gói mô-đun nhưng đối với tôi nó chỉ là một trình chạy tác vụ. Có gì khác biệt?

webpack-dev-server là một máy chủ web tải lại trực tiếp mà các nhà phát triển Webpack sử dụng để nhận phản hồi ngay lập tức về những gì họ làm. Nó chỉ nên được sử dụng trong quá trình phát triển.

Dự án này được lấy cảm hứng rất nhiều từ công cụ kiểm tra đơn vị nof5 .

Webpack đúng như tên gọi sẽ tạo ra tuổi gói SINGLE cho web . Gói sẽ được thu nhỏ và kết hợp thành một tệp duy nhất (chúng tôi vẫn sống trong thời đại HTTP 1.1). Webpack thực hiện phép thuật kết hợp các tài nguyên (JavaScript, CSS, hình ảnh) và đưa chúng vào như thế này : .<script src="assets/bundle.js"></script>

Nó cũng có thể được gọi là bộ đóng gói mô-đun vì nó phải hiểu các phụ thuộc mô-đun và cách lấy các phụ thuộc và kết hợp chúng lại với nhau.

Bạn sẽ sử dụng browserify ở đâu? Chúng ta có thể làm tương tự với nhập khẩu nút / ES6 không?

Bạn có thể sử dụng Browserify trên cùng các tác vụ chính xác nơi bạn sẽ sử dụng Webpack . - Webpack nhỏ gọn hơn, mặc dù.

Lưu ý rằng các tính năng của trình tải mô-đun ES6 trong Webpack2 đang sử dụng System.import , không phải là một trình duyệt duy nhất hỗ trợ nguyên bản.

Khi nào bạn sẽ sử dụng gulp / grunt trên npm + plugin?

Bạn có thể quên Gulp, Grunt, Brokoli, Brunch và Bower . Thay vào đó, hãy sử dụng trực tiếp các tập lệnh dòng lệnh npm và bạn có thể loại bỏ các gói bổ sung như thế này tại đây cho Gulp :

var gulp        = require('gulp'),
  minifyCSS     = require('gulp-minify-css'),
  sass          = require('gulp-sass'),
  browserify    = require('gulp-browserify'),
  uglify        = require('gulp-uglify'),
  rename        = require('gulp-rename'),
  jshint        = require('gulp-jshint'),
  jshintStyle   = require('jshint-stylish'),
  replace       = require('gulp-replace'),
  notify        = require('gulp-notify'),

Bạn có thể có thể sử dụng trình tạo tệp cấu hình GulpGrunt khi tạo tệp cấu hình cho dự án của bạn. Bằng cách này, bạn không cần phải cài đặt Yeoman hoặc các công cụ tương tự.


14

Sợi là một người quản lý gói gần đây có lẽ xứng đáng được đề cập.
Vì vậy, đây là: https://yarnpkg.com/

Theo như tôi biết, nó có thể lấy cả phụ thuộc npm và bower và có các tính năng được đánh giá cao khác.


12

Webpacklà một bó. Giống như Browserfynó tìm trong cơ sở mã cho các yêu cầu mô-đun ( requirehoặc import) và giải quyết chúng một cách đệ quy. Hơn thế nữa, bạn có thể định cấu hình Webpackđể giải quyết không chỉ các mô-đun giống như JavaScript, mà cả CSS, hình ảnh, HTML, theo nghĩa đen mọi thứ. Điều đặc biệt khiến tôi thích thú Webpack, bạn có thể kết hợp cả hai mô-đun được biên dịch và tải động trong cùng một ứng dụng. Do đó, người ta có được sự tăng hiệu suất thực sự, đặc biệt là qua HTTP / 1.x. Làm thế nào chính xác bạn bạn làm điều đó tôi đã mô tả với ví dụ ở đây http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Là một thay thế cho bundler ai có thể nghĩ đến Rollup.js( https://rollupjs.org/ ) , giúp tối ưu hóa mã trong quá trình biên dịch, nhưng tước bỏ tất cả các khối không sử dụng được tìm thấy.

Đối với AMD, thay vì RequireJSmột người có thể đi với bản địa ES2016 module system, nhưng được tải bằng System.js( https://github.com/systemjs/systemjs )

Bên cạnh đó, tôi sẽ chỉ ra rằng npmnó thường được sử dụng như một công cụ tự động hóa như grunthoặc gulp. Hãy xem https://docs.npmjs.com/misc/scripts . Cá nhân tôi bây giờ đi với các kịch bản npm chỉ tránh các công cụ tự động hóa khác, mặc dù trong quá khứ tôi đã rất thích grunt. Với các công cụ khác, bạn phải dựa vào vô số plugin cho các gói, thường không được viết tốt và không được duy trì tích cực. npmbiết các gói của nó, vì vậy bạn gọi bất kỳ gói nào được cài đặt cục bộ theo tên như:

{
  "scripts": {
    "start": "npm http-server"
  },
  "devDependencies": {
    "http-server": "^0.10.0"
  }
}

Trên thực tế, bạn là một quy tắc không cần bất kỳ plugin nào nếu gói hỗ trợ CLI.

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.