NPM vs. Bower vs. Browserify vs. Gulp vs. Grunt vs Webpack


1886

En popüler JavaScript paketi yöneticileri, paketleyicileri ve görev koşucuları hakkındaki bilgilerimi özetlemeye çalışıyorum. Yanılıyorsam lütfen beni düzeltin:

  • npm& bowerpaket yöneticileridir. Sadece bağımlılıkları indiriyorlar ve kendi başlarına nasıl proje oluşturacaklarını bilmiyorlar. Bildikleri, tüm bağımlılıkları getirip çağırdıktan sonra webpack/ gulp/ çağırmaktır grunt.
  • bowergibidir npm, ancak düzleştirilmiş bir bağımlılık ağaçları oluşturur (bunun aksine npm, yinelemeli olarak yapar). Anlam npm, her bağımlılık için bağımlılıkları getirir (birkaç kez aynı getirebilir), ancak boweralt bağımlılıkları el ile eklemenizi bekler. Bazen bowerve npmsırasıyla ön uç ve arka uç için birlikte kullanılır (çünkü her megabayt ön uçta önemli olabilir).
  • gruntve gulpotomatikleştirilebilen her şeyi otomatikleştirmek için görev koşuculardır (örn. CSS / Sass derlemek, görüntüleri optimize etmek, bir paket yapmak ve küçültmek / aktarmak).
  • gruntvs. gulp( mavenvs. gradleveya yapılandırma vs koduna benzer). Grunt ayrı bağımsız görevleri yapılandırmaya dayanır, her görev dosyayı açar / işler / kapatır. Gulp daha az kod gerektirir ve boru zincirleri oluşturmasına (aynı dosyayı yeniden açmadan) izin veren ve daha hızlı hale getiren Düğüm akışlarına dayanır.
  • webpack( webpack-dev-server) - benim için tüm JS / CSS izleyicileri unutmanızı sağlayan değişikliklerin sıcak yeniden yüklenmesi ile bir görev koşucusu.
  • npm/ bower+ eklentileri görev koşucularının yerini alabilir. Onların yetenekleri genellikle kesişir, bu nedenle gulp/ gruntover npm+ eklentilerini kullanmanız gerekiyorsa farklı çıkarımlar vardır . Ancak görev koşucuları karmaşık görevler için kesinlikle daha iyidir (örn. "Her yapıda paket oluşturun, ES6'dan ES5'e aktarın, tüm tarayıcı emülatörlerinde çalıştırın, ekran görüntüleri yapın ve ftp aracılığıyla dropbox'a dağıtın").
  • browserifytarayıcılar için paketleme düğümü modüllerine izin verir. browserifyvs node's requireaslında AMD vs CommonJS'dir .

Sorular:

  1. Nedir webpack& webpack-dev-server? Resmi belgeler bunun bir modül paketçisi olduğunu söylüyor ancak benim için sadece bir görev koşucusu. Fark ne?
  2. Nerede kullanırsın browserify? Aynı şeyi düğüm / ES6 ithalatları ile yapamaz mıyız?
  3. gulp/ gruntOver npm+ eklentilerini ne zaman kullanırsınız ?
  4. Bir kombinasyon kullanmanız gerektiğinde lütfen örnekler verin

52
toplama eklemek için zaman ? 😝
gman

167
bu çok makul bir soru. benim gibi sözde web-devs haftalık bir şekilde uygulanan tüm paketleri üzerinde tökezlemek ..
Simon Dirmeier


41
@Fisherman Ben bu konuda tamamen yeniyim ve tamamen çılgınca görünüyor ...
David Stosik

13
@Fisherman Az önce okuduğum "tavsiye edilen" yorum daha da kötüydü! D: Sadece birkaç CSS / JS kütüphanesi kullanan ve bunu bir araya getirebilecek bir araca sahip olmaktan faydalanacak bir statik sayfa oluşturmak istiyorum ... Ctrl-C'ye biraz dinlenmek için cazip bir motorda at / Ctrl-V parmakları ve bu mükemmel olurdu ... Ve yine de, saatlerce, hala gitmek için bir yol bulmaya çalışıyor ...
David Stosik

Yanıtlar:


1028

Webpack ve Tarayıcı

Webpack ve Browserify hemen hemen aynı işi yapar, bu da kodunuzu hedef bir ortamda kullanmak için işler (Düğüm gibi diğer ortamları hedefleyebilmenize rağmen çoğunlukla tarayıcı). Bu tür işlemenin sonucu, bir veya daha fazla demettir - hedeflenen ortam için uygun birleştirilmiş komut dosyalarıdır.

Örneğin, ES6 kodunu modüllere bölünmüş olarak yazdığınızı ve bunu bir tarayıcıda çalıştırabilmek istediğinizi varsayalım. Bu modüller Düğüm modülleriyse, tarayıcı yalnızca Düğüm ortamında bulunduğundan bunları anlamaz. ES6 modülleri IE11 gibi eski tarayıcılarda da çalışmaz. Dahası, tarayıcıların henüz uygulamadığı deneysel dil özelliklerini (ES sonraki teklifleri) kullanmış olabilirsiniz, bu nedenle böyle bir komut dosyasını çalıştırmak sadece hatalar atacaktır. Webpack ve Browserify gibi araçlar, bu kodu tarayıcının çalıştırabileceği bir forma çevirerek bu sorunları çözer . Bunun da ötesinde, bu paketlere çok çeşitli optimizasyonlar uygulanmasını mümkün kılıyorlar.

Bununla birlikte, Webpack ve Browserify birçok yönden farklıdır, Webpack varsayılan olarak birçok araç sunar (örn. Kod bölme), Browserify bunu sadece eklentileri indirdikten sonra yapabilir, ancak her ikisini de kullanmak çok benzer sonuçlara yol açar . Kişisel tercihe bağlıdır (Webpack daha trend). Btw, Webpack bir görev koşucusu değildir, sadece dosyalarınızın işlemcisidir (yükleyiciler ve eklentiler olarak adlandırılır) ve bir görev koşucusu tarafından çalıştırılabilir (diğer yollarla).


Webpack Dev Server

Webpack Dev Server, uygulamanız üzerinde çalışırken hızlı bir şekilde dağıtabileceğiniz ve geliştirme sunucunuzun kod değişikliklerinde tarayıcıyı otomatik olarak yenilediği veya hatta değişen kodu yaydığı bir geliştirme sunucusu olan Browsersync'e benzer bir çözüm sunar. sıcak modül değişimi ile yeniden yüklemeden tarayıcıya.


Görev koşucuları ve NPM betikleri

Özlü ve kolay görev yazımı için Gulp kullanıyorum, ancak daha sonra ne Gulp ne de Grunt'a ihtiyacım olmadığını öğrendim. Şimdiye kadar ihtiyacım olan her şey, API'leri aracılığıyla üçüncü taraf araçları çalıştırmak için NPM komut dosyaları kullanılarak yapılmış olabilir. Gulp, Grunt veya NPM senaryoları arasında seçim yapmak, ekibinizin zevkine ve deneyimine bağlıdır.

Gulp veya Grunt'taki görevler JS'ye aşina olmayan insanlar için bile okunması kolay olsa da, ihtiyaç duyulan ve öğrenen başka bir araçtır ve kişisel olarak bağımlılıklarımı daraltmayı ve işleri basitleştirmeyi tercih ederim. Öte yandan, bu görevleri, bu üçüncü taraf araçlarını çalıştıran NPM komut dosyalarının ve (muhtemelen JS) komut dosyalarının birleşimiyle değiştirmek (örneğin , temizleme amacıyla rimrafı yapılandıran ve çalıştıran düğüm komut dosyası ) daha zor olabilir. Ancak vakaların çoğunda, bu üçü sonuçları açısından eşittir.


Örnekler

Örneklere gelince , size tüm derleme ve dağıtım sürecini kapsayan NPM ve JS betiklerinin güzel bir kombinasyonunu gösteren bu React başlangıç ​​projesine göz atmanızı öneririm . Bu NPM komut dosyalarını package.jsonkök klasöründe, adlı bir özellikte bulabilirsiniz scripts. Orada çoğunlukla gibi komutlarla karşılaşacaksınız babel-node tools/run start. Babel-düğüm birinci derlenir ES6 dosyasına CLI aracı (üretim kullanıma yönelik değildir), bir tools/run(run.js bulunan dosyası araçlar temel olarak bir atlet programı -). Bu koşucu bir işlevi bağımsız değişken olarak alır ve yürütür, bu durumda start- başka bir yardımcı program (start.js) kaynak dosyaları (hem istemci hem de sunucu) paketlemekten ve uygulama ve geliştirme sunucusunu başlatmaktan sorumludur (dev sunucusu muhtemelen Webpack Dev Server veya Browsersync olacaktır).

Daha kesin olarak konuşmak gerekirse, start.jshem istemci hem de sunucu tarafı paketleri oluşturur, hızlı bir sunucu başlatır ve başarılı bir başlatmadan sonra, yazma sırasında şu şekilde görünen Tarayıcı senkronizasyonunu başlatır (lütfen en yeni kod için reaksiyon başlatma projesine bakın ).

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)

Önemli proxy.targetolan, http: // localhost: 3000 olabilen proxy yapmak istedikleri sunucu adresini ayarladıkları ve Browsersync , oluşturulan varlıkların otomatik değişimle sunulduğu http: // localhost: 3001'de dinleyen bir sunucu başlatır. algılama ve sıcak modül değişimi. Gördüğünüz gibi, filestek tek dosyalar veya desenler içeren başka bir yapılandırma özelliği var Tarayıcı senkronizasyonu değişiklikleri izler ve bazıları meydana gelirse tarayıcıyı yeniden yükler, ancak yorumda belirtildiği gibi, Webpack js kaynaklarını HMR ile tek başına izlemeye özen gösterir, bu nedenle işbirliği yaparlar Orada.

Şimdi böyle bir Grunt veya Gulp yapılandırmasına eşdeğer bir örneğim yok, ancak Gulp ile (ve biraz da Grunt ile) gulpfile.js'de bireysel görevler yazacaksınız

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

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

Başlangıç ​​kitinde hemen hemen aynı şeyleri yapacağınız, bu sefer sizin için bazı sorunları çözen, ancak kullanımı öğrenirken kendi sorunlarını ve bazı zorlukları sunan görev koşucusu ile ve dediğim gibi, ne kadar bağımlılığınız varsa o kadar çok yanlış gidebilir. İşte bu yüzden bu araçlardan kurtulmayı seviyorum.


3
mükemmel cevap! Lütfen web paketinin / browserify tarayıcısında yeniden kullanım düğümü modüllerini hangi yolla yöneteceğini açıklayabilir misiniz?
VB_

4
Webpack bağımlılıkları (dışa aktarılan modül değerleri) nesneye (yüklüModüller) birleştirir. Bu nedenle, her modül o nesnenin özelliğidir ve bu özelliğin adı onun kimliğini temsil eder (örneğin 1, 2, 3 ... vb.). Kaynağınızda bu tür bir modüle her ihtiyaç duyduğunuzda, webpack, argümandaki modül kimliğiyle (ör. __Webpack_require __ (1)) değeri işlev çağrısına dönüştürür. Browserify'nin bunu nasıl ele aldığından emin değilim.
Dan Macák

@Dan Skočdopole Daha fazla ayrıntı verebilir misiniz?
Asim KT

1
Ben yudum veya homurdanma temel kullanımını sunmayı kabul etmiyorum, bu ikisi google kullanarak karşılaştırmak kolaydır, webpack-dev-server önce web paketini anlamak gerektirir ve bu bu soru / cevap kapsamı dışındadır, ancak sundum bazı Browsersync yapılandırması. Başlangıç ​​kitinde haklısın, ve ben daha çok detaylandırdım.
Dan Macák

5
Her yeni paketin kullanılması gereken (daha fazla) popüler görüşü izlemek yerine işleri basit tutmak için bağımlılıkları azaltmak için +1!
madannes

675

Ekim 2018 Güncellemesi

Ön uç geliştirici hakkında hala emin değilseniz, burada mükemmel bir kaynağa hızlı bir şekilde göz atabilirsiniz.

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

Haziran 2018 Güncellemesi

Başından beri orada bulunmadıysanız modern JavaScript öğrenmek zordur. Yeni gelen iseniz, daha iyi bir genel bakış için bu mükemmel yazılı kontrol etmeyi unutmayın.

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

Temmuz 2017 Güncellemesi

Son zamanlarda 2017'de ön uç geliştirmeye nasıl yaklaşılacağı konusunda Grab ekibinden gerçekten kapsamlı bir rehber buldum. Aşağıdaki gibi kontrol edebilirsiniz.

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


Ben de orada bir sürü araç var ve her biri bize farklı bir açıdan yarar sağlar çünkü oldukça uzun bir süre için arıyorum. Topluluk, gibi araçlara ayrılmıştır Browserify, Webpack, jspm, Grunt and Gulp. Ayrıca duyabilirsiniz Yeoman or Slush. Bu gerçekten bir sorun değil, sadece ileriye yönelik net bir yol anlamaya çalışan herkes için kafa karıştırıcı.

Her neyse, bir şeyler yapmak istiyorum.

1. Paket Yöneticisi

Paket yöneticileri,: jQuery, Bootstrap, vb. Gibi kütüphaneler olan proje bağımlılıklarının yüklenmesini ve güncellenmesini kolaylaştırır - sitenizde kullanılan ve sizin tarafınızdan yazılmayan her şey.

Tüm kütüphane web sitelerine göz atma, arşivleri indirme ve paketten çıkarma, dosyaları projelere kopyalama - bunların tümü terminaldeki birkaç komutla değiştirilir.

  • NPMkısaltması: Node JS package manageryazılımınızın bağlı olduğu tüm kitaplıkları yönetmenize yardımcı olur. İhtiyaçlarınızı komut satırında package.jsonçalıştırıp çalıştırdığınız bir dosyada tanımlarsınız npm install... sonra BANG, paketleriniz indirilir ve kullanıma hazır hale gelir. Her iki front-end and back-endkütüphane için de kullanılabilir .

  • Bower: ön uç paket yönetimi için bu konsept NPM ile aynıdır. Tüm kitaplıklarınız adlı bir dosyada saklanır ve komut satırında bower.jsonçalıştırılır bower install.

Arasındaki en büyük fark Bowerve NPMBower aşağıdaki gibi düz bir bağımlılık ağacı gerektirir iken NPM iç içe bağımlılık ağacını yapmasıdır.

Alıntı Yapmak Bower ve npm arasındaki fark nedir?

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

kameriye

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

Üzerinde bazı güncellemeler var npm 3 Duplication and Deduplication, lütfen daha fazla ayrıntı için dokümanı açın.

  • Yarn: İçin yeni bir paket yöneticisi JavaScript yayınlanan tarafından Facebookoranla biraz daha avantajları ile son zamanlarda NPM. Ve İplik ile, yine hem kullanabilir NPMve Bowerpaket almaya defteri. Daha önce bir paket yüklediyseniz, yarnkolaylaştıran önbelleğe alınmış bir kopya oluşturur offline package installs.

  • jspm: SystemJSdinamik ES6modül yükleyicinin üzerine kurulmuş evrensel modül yükleyici için paket yöneticisidir . Kendi kuralları olan tamamen yeni bir paket yöneticisi değil, mevcut paket kaynaklarının üstünde çalışır. Kutudan, birlikte çalıştığı GitHubve npm. Temel Bowerpaketlerin çoğu temel alındığından GitHub, bu paketleri de kullanarak yükleyebiliriz jspm. Daha kolay kurulum için yaygın olarak kullanılan ön uç paketlerinin çoğunu listeleyen bir kayıt defteri vardır.

Farklı arasında Bkz Bowerve jspm: Paket Yöneticisi: jspm vs Bower


2. Modül Yükleyici / Demetleme

Herhangi bir ölçekte projelerin çoğu, kodları birkaç dosya arasında bölünür. <script>Bununla birlikte, her bir dosyayı ayrı bir etikete dahil edebilirsiniz, ancak <script>yeni bir http bağlantısı kurar ve küçük dosyalar için - bu modülerliğin bir amacıdır - bağlantının ayarlanması, verilerin aktarılmasından çok daha uzun sürebilir. Komut dosyaları indirilirken sayfada hiçbir içerik değiştirilemez.

  • İndirme süresi sorunu, bir grup basit modülü tek bir dosyada birleştirip minimize ederek büyük ölçüde çözülebilir.

Örneğin

<head>
    <title>Wagon</title>
    <script src=“build/wagon-bundle.js”></script>
</head>
  • Performans, esneklik pahasına gelir. Modüllerinizin birbirine bağımlılığı varsa, bu esneklik eksikliği bir gösterici olabilir.

Örneğin

<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>

Bilgisayarlar bunu yapabileceğinizden daha iyi yapabilir ve bu yüzden her şeyi otomatik olarak tek bir dosyaya toplamak için bir araç kullanmalısınız.

Sonra duydum yaklaşık RequireJS, Browserify, WebpackveSystemJS

  • RequireJS: bir JavaScriptdosya ve modül yükleyicisidir. Tarayıcı içi kullanım için optimize edilmiştir, ancak diğer JavaScript ortamlarında da kullanılabilir Node.

Örn: 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
    }
});

İçinde bağımlılık olarak main.jsiçe aktarabilir myModule.jsve kullanabiliriz.

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

Ve sonra bizim HTML, ile birlikte başvurabiliriz RequireJS.

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

Hakkında daha fazla bilgi edinin CommonJSve AMDkolayca anlaşın. CommonJS, AMD ve RequireJS arasındaki ilişki?

  • Browserify: CommonJSbiçimlendirilmiş modüllerin tarayıcıda kullanılmasına izin verecek şekilde ayarlanmıştır . Sonuç olarak, Browserifybir modül paketleyicisi kadar bir modül yükleyici değildir: Browserifytamamen bir oluşturma zamanı aracıdır ve daha sonra istemci tarafına yüklenebilecek bir kod paketi üretir.

Düğümü & npm kurulu olan bir derleme makinesi ile başlayın ve paketi alın:

npm install -g save-dev browserify

Modüllerinizi CommonJSformatta yazın

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

Ve mutlu olduğunda, paketleme komutunu verin:

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

Browserify, giriş noktasının tüm bağımlılıklarını özyineli olarak bulur ve bunları tek bir dosyada birleştirir:

<script src=”bundle-name.js”></script>
  • Webpack: JavaScriptResimler, CSS ve daha fazlası dahil olmak üzere tüm statik varlıklarınızı tek bir dosyada toplar. Ayrıca, dosyaları farklı yükleyici türleri ile işlemenizi sağlar. Eğer yazabilirsiniz JavaScriptile CommonJSveya AMDmodüller sözdizimi. Yapı sorununa temelde daha entegre ve görüşlü bir şekilde saldırır. Gelen Browserifykullanmak Gulp/Gruntve dönüşümleri ve eklentileri uzun bir liste işin yapılması için. Webpacknormalde ihtiyacınız olmayan Gruntveya Gulphiç kutudan yeterli güç sağlar .

Temel kullanım basit değildir. Web paketini Browserify gibi yükleyin:

npm install -g save-dev webpack

Ve komutu bir giriş noktası ve bir çıktı dosyası iletin:

webpack ./entry-point.js bundle-name.js
  • SystemJS:, günümüzde kullanılan popüler biçimlerden herhangi birinde çalışma zamanında modül içe aktarabilen bir modül yükleyicidir ( CommonJS, UMD, AMD, ES6). ES6Modül yükleyici çoklu dolgusunun üzerine inşa edilmiştir ve kullanılan formatı algılayacak ve uygun şekilde işleyebilecek kadar akıllıdır. SystemJSAyrıca ES6 kodunu (ile transpile edebilir Babelya Traceur) ya da gibi diğer dilleri TypeScriptve CoffeeScriptkullanan eklentileri.

Ne olduğunu node moduleve neden tarayıcı içi için iyi uyarlanmadığını bilmek istiyorum .

Daha faydalı makale:


Neden jspmve SystemJS?

Ana hedeflerinden biri ES6modülerlik (gerçekten basit kurulumu yapmak ve internette herhangi bir yerden herhangi bir JavaScript kütüphanesini kullanmaktır Github, npmvs.). Sadece iki şeye ihtiyaç vardır:

  • Kütüphaneyi kurmak için tek bir komut
  • Kütüphaneyi içe aktarmak ve kullanmak için tek bir kod satırı

Böylece jspm, bunu yapabilirsiniz.

  1. Kütüphaneyi bir komutla yükleyin: jspm install jquery
  2. HTML dosyanızın içinde harici referansa gerek kalmadan tek bir kod satırı ile kütüphaneyi içe aktarın.

display.js

var $ = require('jquery'); 

$('body').append("I've imported jQuery!");
  1. Ardından System.config({ ... }), modülünüzü içe aktarmadan önce bunları yapılandırın . Normalde çalıştırıldığında jspm init, config.jsbu amaçla adlandırılmış bir dosya olacaktır .

  2. Koşmak Bu komut dosyalarını hale getirmek için, yüke ihtiyaç system.jsve config.jsHTML sayfası üzerinde. Bundan sonra display.jsdosyayı SystemJSmodül yükleyicisini kullanarak yükleyeceğiz .

index.html

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

Not: Açısal 2 uyguladığı için npmile de kullanabilirsiniz Webpack. O zamandan beri jspmentegre olmak için geliştirildi SystemJSve mevcut npmkaynağın üstünde çalışıyor , bu yüzden cevabınız size kalmış.


3. Görev koşucusu

Görev koşucuları ve oluşturma araçları öncelikle komut satırı araçlarıdır. Neden bunları kullanmalıyız: Tek kelimeyle: otomasyon . Minyatür, derleme, birim testi, linting gibi tekrarlayan görevleri yerine getirirken daha az iş yapmanız gerekir.

  • Grunt: Bir yapılandırma dosyası ile kodları önceden işlemek veya geliştirme komut dosyaları oluşturmak için geliştirme ortamınız için otomasyon oluşturabilirsiniz ve karmaşık bir görevi yerine getirmek çok zor görünüyor. Son birkaç yıldır popüler.

İçindeki her görev, Gruntbirbirinden tamamen bağımsız ve sıralı bir şekilde yürütülen farklı eklenti yapılandırmalarından oluşan bir dizi.

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: Otomasyon gibi, Gruntancak yapılandırmalar yerine, JavaScriptbir düğüm uygulaması gibi akışlarla yazabilirsiniz . Bu günleri tercih edin.

Bu Gulpörnek bir görev bildirimidir.

//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);
});

Daha fazlasını görün: https://medium.com/@preslavrachev/gulp-vs-grunt-why-one-why-the-other-f5d3b398edc4#.fte0nahri


4. İskele aletleri

  • Slush and Yeoman: Onlarla başlangıç ​​projeleri oluşturabilirsiniz. Örneğin, HTML ve SCSS ile bir prototip oluşturmayı, ardından scss, css, img, fontlar gibi manuel olarak bir klasör oluşturmayı planlıyorsunuz. yeomanBasit bir komut dosyası yükleyebilir ve çalıştırabilirsiniz. O zaman burada her şey senin için.

Daha fazlasını burada bulabilirsiniz .

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

Daha fazlasını görün: https://www.quora.com/What-are-the-differences-between-NPM-Bower-Grunt-Gulp-Webpack-Browserify-Slush-Yeoman-and-Express


Cevabım sorunun içeriği ile gerçekten eşleşmiyor, ancak Google'da bu bilgileri ararken, her zaman üstte soruyu görüyorum, böylece özet olarak cevaplamaya karar verdim. Umarım faydalı bulmuşsunuzdur.


64

Tamam, hepsinin benzerlikleri var, sizin için aynı şeyleri farklı ve benzer şekillerde yapıyorlar, onları aşağıdaki gibi 3 ana gruba ayırıyorum:


1) Modül paketleyicileri

popüler olarak webpack ve browserify, görev koşucuları gibi çalışır, ancak daha fazla esneklikle, her şeyi ayarınız olarak bir araya getirir, böylece sonucu örneğin CSS ve Javascript dahil tek bir dosyada bundle.js olarak gösterebilirsiniz. her birinin daha fazla ayrıntı için aşağıdaki ayrıntılara bakın:

webpack

webpack, modern JavaScript uygulamaları için bir modül paketleyicisidir. Webpack uygulamanızı işlediğinde, uygulamanızın ihtiyaç duyduğu her modülü içeren özyinelemeli bir grafik oluşturur, ardından tüm bu modülleri tarayıcı tarafından yüklenecek az sayıda pakete (genellikle yalnızca bir tane) paketler.

İnanılmaz şekilde yapılandırılabilir, ancak başlamak için sadece Dört Temel Kavram'ı anlamanız gerekir: giriş, çıkış, yükleyiciler ve eklentiler.

Bu belgenin, ayrıntılı konsepte özel kullanım durumlarına bağlantılar sağlarken, bu kavramlara üst düzey bir genel bakış sunması amaçlanmıştır.

daha fazlası burada

browserify

Browserify, tarayıcıda kullanılmak üzere derlenen node.js tarzı modüller yazmamızı sağlayan bir geliştirme aracıdır. Düğüm gibi, modüllerimizi ayrı dosyalara yazıyoruz, module.exports ve export değişkenlerini kullanarak dış yöntemleri ve özellikleri dışa aktarıyoruz. Gereksinim işlevini kullanarak başka modüllere bile ihtiyaç duyabiliriz ve göreli yolu atlarsak, düğüm_modülleri dizinindeki modüle çözümlenir.

daha fazlası burada


2) Görev koşucuları

gulp ve grunt, görev koşuculardır, temelde ne yaparlarsa, görevler yaratır ve istediğiniz zaman çalıştırırlar, örneğin CSS'nizi küçültmek için bir eklenti yükler ve daha sonra küçültme yapmak için her seferinde çalıştırın, her biri hakkında daha fazla ayrıntı:

yudum

gulp.js, Fractal Innovations ve GitHub'daki açık kaynaklı bir topluluk, ön uç web geliştirmede akış oluşturma sistemi olarak kullanılan açık kaynaklı bir JavaScript araç takımıdır. Mindetasyon, birleştirme, önbellek bozma, birim testi, linting, optimizasyon vb. görevlerini tanımlamak için yapılandırmada bir kod yaklaşımı ve bunları gerçekleştirmek için küçük, tek amaçlı eklentilerine dayanır. gulp ekosistemi, aralarından seçim yapabileceğiniz 1000'den fazla eklentiye sahiptir.

daha fazlası burada

homurtu

Grunt, JavaScript görev koşucusu, küçültme, derleme, birim testi, linting vb. Gibi sık kullanılan görevleri otomatik olarak gerçekleştirmek için kullanılan bir araçtır. Bir dosyada tanımlanan (Gruntfile olarak bilinen) özel görevleri çalıştırmak için bir komut satırı arayüzü kullanır . Grunt, Ben Alman tarafından oluşturuldu ve Node.js'de yazıldı. Npm ile dağıtılır. Şu anda, Grunt ekosisteminde beş binden fazla eklenti var.

daha fazlası burada


3) Paket yöneticileri

paket yöneticileri, yaptıkları, uygulamanızda ihtiyacınız olan eklentileri yönetmek ve paket.json kullanarak github vb. aracılığıyla sizin için yüklemek, modülleri güncellemek, yüklemek ve uygulamanızı paylaşmak için çok kullanışlı, her biri için daha fazla ayrıntı:

npm

npm, JavaScript programlama dili için paket yöneticisidir. Node.js JavaScript çalışma zamanı ortamı için varsayılan paket yöneticisidir. Ayrıca, npm olarak da adlandırılan bir komut satırı istemcisinden ve npm kayıt defteri adı verilen çevrimiçi bir genel paket veritabanından oluşur. Kayıt defterine istemci aracılığıyla erişilir ve kullanılabilir paketler npm web sitesi üzerinden taranabilir ve aranabilir.

daha fazlası burada

kameriye

Bower, HTML, CSS, JavaScript, yazı tipleri ve hatta görüntü dosyaları içeren bileşenleri yönetebilir. Bower, kodu birleştirmez veya küçültmez veya başka bir şey yapmaz - sadece ihtiyacınız olan paketlerin doğru sürümlerini ve bağımlılıklarını yükler. Başlamak için Bower, her yerden paketleri getirip kurarak, aradığınız şeyleri avlamaya, bulmaya, indirmeye ve kaydederek çalışır. Bower bu paketlerin bir listesini manifest dosyasında (bower.json) takip eder.

daha fazlası burada

ve kaçırılmaması gereken en son paket yöneticisi, gerçek çalışma ortamında genç ve hızlıdır, daha önce kullandığım npm ile karşılaştırır, modülleri yeniden yüklemek için, modülün varlığını kontrol etmek için node_modules klasörünü iki kez kontrol eder, ayrıca modüllerin kurulması daha az zaman alır:

iplik

İplik, kodunuz için bir paket yöneticisidir. Tüm dünyadaki diğer geliştiricilerle kod kullanmanıza ve paylaşmanıza olanak tanır. İplik bunu hızlı, güvenli ve güvenilir bir şekilde yapar, böylece endişelenmenize gerek kalmaz.

İplik, diğer geliştiricilerin çözümlerini farklı sorunlara kullanmanızı sağlayarak yazılımınızı geliştirmenizi kolaylaştırır. Sorunlarınız varsa, sorunları bildirebilir veya katkıda bulunabilirsiniz ve sorun çözüldüğünde, her şeyi güncel tutmak için İplik'i kullanabilirsiniz.

Kod, paket adı verilen bir şeyle (bazen modül olarak da adlandırılır) paylaşılır. Paket, paylaşılan tüm kodu ve paketi açıklayan package.json dosyasını içerir.

daha fazlası burada



Gulp eklentilerinin bir listesi var mı? gerçekten 1000+ var mı? npm sadece 20 ya da öylesine?
flurbius

1
Harika özet. Modern bir web geliştirme hakkında herhangi bir tartışma için bir giriş noktası olmalıdır.
Adam Bubela

1
@flurbius Evet, burada: gulpjs.com/plugins . Şu anda 3.465 Gulp eklentisi var gibi görünüyor.
mts,

52

Npmcompare üzerinde bazı teknik karşılaştırmalar bulabilirsiniz

Karşılaştırma browserify ile grunt ile gulp vs webpack

Gördüğünüz gibi webpack ortalama her 4 günde bir çıkan yeni bir sürüm ile çok iyi korunur. Ancak Gulp hepsinin en büyük topluluğuna sahip gibi görünüyor (Github'da 20K'dan fazla yıldızla) Grunt (diğerlerine kıyasla) biraz ihmal edilmiş görünüyor

Yani diğerini seçmeniz gerekirse Gulp ile giderdim


5
webpack şimdi Github'da 26k başlar ve 25.7k ile gulp. Popülerlik faktörünü artık karar vermek için kullanamıyorum ...
Rayee Roded


14

Webpack & webpack-dev-server nedir? Resmi belgeler bunun bir modül paketçisi olduğunu söylüyor ancak benim için sadece bir görev koşucusu. Fark ne?

webpack-dev-server Webpack geliştiricilerinin yaptıklarıyla ilgili anında geri bildirim almak için kullandıkları canlı yeniden yükleme web sunucusudur . Sadece geliştirme sırasında kullanılmalıdır.

Bu proje nof5 ünitesi test aracından büyük ölçüde ilham almıştır .

Adından da anlaşılacağı üzere Webpack , web için bir SINGLE paket yaşı oluşturur . Paket simge durumuna küçültülecek ve tek bir dosyada birleştirilecektir (hala HTTP 1.1 çağında yaşıyoruz). Webpack kaynakları (JavaScript, CSS, resimler) birleştirme ve bunları şu şekilde enjekte etme sihrini yapar:<script src="assets/bundle.js"></script> .

Modül bağımlılıklarını ve bağımlılıkların nasıl ele alınacağını ve birlikte paketleneceğini anlaması gerektiğinden modül paketleyicisi olarak da adlandırılabilir .

Browserify'ı nerede kullanırsınız? Aynı şeyi düğüm / ES6 ithalatları ile yapamaz mıyız?

Sen kullanabilirsiniz Browserify kullanırsınız aynı görevlere WebPack . - Web paketi daha kompakt.

O Not ES6 modülü yükleyici özellikleri de Webpack2 kullandığınız System.import hangi bir tek tarayıcı destekleri doğal.

Npm + eklentileri üzerinde ne zaman gulp / grunt kullanırsınız?

Sen olabilir unutmak Gulp, Grunt, brokoli, Brunch ve Bower . Bunun yerine doğrudan npm komut satırı komut dosyalarını kullanın ve Gulp için burada bunun gibi ekstra paketleri kaldırabilirsiniz :

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'),

Muhtemelen kullanabilirsiniz Gulp ve Grunt projeniz için yapılandırma dosyaları oluştururken yapılandırma dosyası jeneratörleri. Bu şekilde Yeoman veya benzeri araçları kurmanıza gerek kalmaz .


14

İplik, muhtemelen bahsetmeyi hak eden yeni bir paket yöneticisidir.
Yani, işte burada: https://yarnpkg.com/

Bildiğim kadarıyla hem npm hem de bower bağımlılıklarını getirebilir ve diğer takdir edilen özelliklere sahiptir.


12

Webpackbir paketleyicidir. Gibi Browserfyo modül istekleri (için kod temeli arar requireveya importyinelemeli) ve giderir onları. Dahası, Webpacksadece JavaScript benzeri modülleri değil, CSS, resimler, HTML, kelimenin tam anlamıyla her şeyi çözmek için yapılandırabilirsiniz . Beni özellikle heyecanlandıran şey Webpack, hem derlenmiş hem de dinamik olarak yüklenmiş modülleri aynı uygulamada birleştirebilirsiniz. Böylece, özellikle HTTP / 1.x üzerinden gerçek bir performans artışı elde edilir. Tam olarak nasıl yaptığınızı burada örneklerle açıkladım http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Bundler için bir alternatif olarak düşünebilirsiniz Rollup.js( https://rollupjs.org/ ) , derleme sırasında kodu optimize eder, ancak bulunan tüm kullanılmamış parçaları sıyırır.

İçin AMD, yerine RequireJSbiri yerli ile gidebilir ES2016 module system, ancak yüklü System.js( https://github.com/systemjs/systemjs )

Ayrıca, npmgenellikle gruntveya gibi bir otomatikleştirme aracı olarak kullanıldığını gösteririm gulp. Check https://docs.npmjs.com/misc/scripts . Ben şahsen npm betikleri ile sadece diğer otomasyon araçlarından kaçınıyorum, geçmişte çok fazla olmasına rağmen grunt. Diğer araçlarla, paketler için genellikle iyi yazılmış ve aktif olarak korunmayan sayısız eklentiye güvenmeniz gerekir. npmpaketlerini bilir, bu nedenle yerel olarak kurulmuş paketlerden herhangi birine adıyla çağrı yapabilirsiniz:

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

Aslında paket CLI'yi destekliyorsa, kural olarak herhangi bir eklentiye ihtiyacınız yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.