Saya mencoba merangkum pengetahuan saya tentang pengelola paket JavaScript, bundler, dan pelari tugas paling populer. Harap perbaiki saya jika saya salah:
npm
&bower
adalah manajer paket. Mereka hanya mengunduh dependensi dan tidak tahu bagaimana membangun proyek sendiri. Yang mereka tahu adalah meneleponwebpack
/gulp
/grunt
setelah mengambil semua dependensi.bower
sepertinpm
, tetapi membangun pohon ketergantungan rata (tidak sepertinpm
yang melakukannya secara rekursif). Artinpm
mengambil dependensi untuk setiap dependensi (dapat mengambil yang sama beberapa kali), sementarabower
mengharapkan Anda untuk secara manual memasukkan sub-dependensi. Kadangbower
- kadang dannpm
digunakan bersama untuk front-end dan back-end (karena masing-masing megabyte mungkin penting di front-end).grunt
dangulp
merupakan pelari tugas untuk mengotomatiskan segala sesuatu yang dapat diotomatiskan (mis. kompilasi CSS / Sass, optimalkan gambar, buat satu bundel dan minify / transpile).grunt
vs.gulp
(sepertimaven
vs.gradle
atau konfigurasi vs kode). Grunt didasarkan pada konfigurasi tugas independen yang terpisah, setiap tugas membuka / menangani / menutup file. Gulp membutuhkan jumlah kode yang lebih sedikit dan didasarkan pada aliran Node, yang memungkinkannya untuk membangun rantai pipa (tanpa membuka kembali file yang sama) dan membuatnya lebih cepat.webpack
(webpack-dev-server
) - bagi saya ini adalah pelari tugas dengan memuat ulang perubahan yang memungkinkan Anda melupakan semua pengamat JS / CSS.npm
/bower
+ plugins dapat menggantikan task runner. Kemampuan mereka sering berpotongan sehingga ada implikasi yang berbeda jika Anda perlu menggunakangulp
/grunt
lebih darinpm
+ plugin. Tetapi pelari tugas jelas lebih baik untuk tugas-tugas kompleks (misalnya "pada setiap build buat bundel, transile dari ES6 ke ES5, jalankan di semua emulator browser, buat tangkapan layar, dan sebarkan ke dropbox melalui ftp").browserify
memungkinkan modul simpul kemasan untuk browser.browserify
vsnode
'srequire
sebenarnya AMD vs CommonJS .
Pertanyaan:
- Apa itu
webpack
&webpack-dev-server
? Dokumentasi resmi mengatakan itu adalah modul bundler tetapi bagi saya itu hanya pelari tugas. Apa bedanya? - Di mana Anda akan menggunakan
browserify
? Tidak bisakah kita melakukan hal yang sama dengan impor node / ES6? - Kapan Anda akan menggunakan
gulp
/grunt
lebih darinpm
+ plugin? - Harap berikan contoh saat Anda perlu menggunakan kombinasi
Jawaban:
Webpack dan Browserify
Webpack dan Browserify melakukan hampir semua pekerjaan yang sama, yaitu memproses kode Anda untuk digunakan dalam lingkungan target (terutama browser, meskipun Anda dapat menargetkan lingkungan lain seperti Node). Hasil pemrosesan tersebut adalah satu atau lebih bundel - skrip rakitan yang cocok untuk lingkungan yang ditargetkan.
Misalnya, Anda menulis kode ES6 yang dibagi menjadi beberapa modul dan ingin dapat menjalankannya di peramban. Jika modul itu adalah modul Node, browser tidak akan memahaminya karena hanya ada di lingkungan Node. Modul ES6 juga tidak akan berfungsi di browser lama seperti IE11. Selain itu, Anda mungkin telah menggunakan fitur bahasa eksperimental (proposal ES berikutnya) yang belum diimplementasikan oleh browser sehingga menjalankan skrip semacam itu hanya akan menimbulkan kesalahan. Alat-alat seperti Webpack dan Browserify menyelesaikan masalah ini dengan menerjemahkan kode tersebut ke bentuk yang dapat dieksekusi oleh browser . Selain itu, mereka memungkinkan untuk menerapkan berbagai macam optimisasi pada bundel tersebut.
Namun, Webpack dan Browserify berbeda dalam banyak hal, Webpack menawarkan banyak alat secara default (mis. Pemecahan kode), sementara Browserify dapat melakukan ini hanya setelah mengunduh plugin tetapi menggunakan keduanya mengarah ke hasil yang sangat mirip . Itu datang ke preferensi pribadi (Webpack lebih trendi). Btw, Webpack bukan pelari tugas, itu hanya prosesor dari file Anda (itu memprosesnya dengan yang disebut loader dan plugin) dan dapat dijalankan (antara lain) oleh pelari tugas.
Webpack Dev Server
Webpack Dev Server menyediakan solusi yang mirip dengan Browsersync - server pengembangan tempat Anda dapat menggunakan aplikasi dengan cepat saat Anda mengerjakannya, dan memverifikasi kemajuan pengembangan Anda segera, dengan server dev secara otomatis menyegarkan browser pada perubahan kode atau bahkan menyebarkan kode yang diubah ke browser tanpa memuat ulang dengan yang disebut penggantian modul panas.
Pelari tugas vs skrip NPM
Saya telah menggunakan Gulp untuk keringkasan dan penulisan tugas yang mudah, tetapi kemudian menemukan bahwa saya tidak membutuhkan Gulp atau Grunt sama sekali. Semua yang pernah saya butuhkan bisa dilakukan dengan menggunakan skrip NPM untuk menjalankan alat pihak ketiga melalui API mereka. Memilih antara skrip Gulp, Grunt atau NPM tergantung pada selera dan pengalaman tim Anda.
Sementara tugas dalam Gulp atau Grunt mudah dibaca bahkan untuk orang-orang yang tidak begitu terbiasa dengan JS, itu adalah alat lain untuk meminta dan belajar dan saya pribadi lebih suka mempersempit dependensi saya dan membuat semuanya menjadi sederhana. Di sisi lain, mengganti tugas-tugas ini dengan kombinasi skrip NPM dan skrip (propably JS) yang menjalankan alat pihak ketiga tersebut (mis. Skrip Node mengonfigurasi dan menjalankan rimraf untuk tujuan pembersihan) mungkin lebih menantang. Tetapi dalam sebagian besar kasus, ketiganya sama dalam hal hasil mereka.
Contohnya
Adapun contoh-contohnya, saya sarankan Anda melihat pada proyek starter Bereaksi ini , yang menunjukkan kepada Anda kombinasi yang bagus dari skrip NPM dan JS yang mencakup seluruh proses build dan deploy. Anda dapat menemukan skrip NPM di
package.json
dalam folder root, di properti bernamascripts
. Di sana Anda sebagian besar akan menemukan perintah sepertibabel-node tools/run start
. Babel-node adalah alat CLI (tidak dimaksudkan untuk penggunaan produksi), yang pada awalnya mengkompilasi filetools/run
ES6 (file run.js terletak di alat ) - pada dasarnya utilitas runner. Pelari ini mengambil fungsi sebagai argumen dan menjalankannya, yang dalam hal ini adalahstart
- utilitas lain (start.js
) bertanggung jawab untuk bundling file sumber (klien dan server) dan memulai aplikasi dan server pengembangan (server dev mungkin akan berupa Webpack Dev Server atau Browsersync).Berbicara lebih tepatnya,
start.js
membuat bundel sisi klien dan server, memulai server ekspres dan setelah peluncuran yang sukses menginisialisasi sinkronisasi Browser, yang pada saat penulisan terlihat seperti ini (lihat mereaksikan proyek starter untuk kode terbaru).Bagian yang penting adalah
proxy.target
, di mana mereka menetapkan alamat server yang ingin mereka proksi, yang bisa berupa http: // localhost: 3000 , dan Browsersync memulai mendengarkan server di http: // localhost: 3001 , di mana aset yang dihasilkan disajikan dengan perubahan otomatis deteksi dan penggantian modul panas. Seperti yang Anda lihat, ada properti konfigurasi lainfiles
dengan file atau pola tersendiri. Browser menyinkronkan jam tangan untuk perubahan dan memuat kembali peramban jika beberapa terjadi, tetapi seperti komentar, Webpack menangani mengawasi sumber js dengan sendirinya dengan HMR, sehingga mereka bekerja sama sana.Sekarang saya tidak memiliki contoh setara dari konfigurasi Grunt atau Gulp tersebut, tetapi dengan Gulp (dan agak mirip dengan Grunt) Anda akan menulis tugas-tugas individu di gulpfile.js seperti
di mana Anda akan melakukan hal-hal yang hampir sama seperti pada starter-kit, kali ini dengan task runner, yang memecahkan beberapa masalah untuk Anda, tetapi menyajikan masalah sendiri dan beberapa kesulitan selama mempelajari penggunaan, dan seperti yang saya katakan, semakin banyak dependensi yang Anda miliki, semakin bisa salah. Dan itulah alasan saya ingin menyingkirkan alat tersebut.
sumber
Perbarui Oktober 2018
Jika Anda masih tidak yakin tentang dev Front-end, dapat melihat cepat ke sumber yang bagus di sini.
https://github.com/kamranahmedse/developer-roadmap
Perbarui Juni 2018
Mempelajari JavaScript modern itu sulit jika Anda belum pernah ke sana sejak awal. Jika Anda pendatang baru, ingatlah untuk memeriksa tulisan yang luar biasa ini untuk mendapatkan ikhtisar yang lebih baik.
https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
Perbarui Juli 2017
Baru-baru ini saya menemukan panduan yang sangat komprehensif dari tim Grab tentang cara mendekati pengembangan front-end pada 2017. Anda dapat memeriksanya seperti di bawah ini.
https://github.com/grab/front-end-guide
Saya juga telah mencari ini cukup lama karena ada banyak alat di luar sana dan masing-masing bermanfaat bagi kita dalam aspek yang berbeda. Komunitas dibagi di antara alat-alat seperti
Browserify, Webpack, jspm, Grunt and Gulp
. Anda mungkin juga mendengar tentangYeoman or Slush
. Itu tidak benar-benar masalah, itu hanya membingungkan bagi semua orang yang mencoba memahami jalan yang jelas ke depan.Lagi pula, saya ingin berkontribusi sesuatu.
1. Pengelola Paket
Manajer paket menyederhanakan menginstal dan memperbarui dependensi proyek, yang merupakan perpustakaan seperti:,
jQuery, Bootstrap
dll - segala sesuatu yang digunakan di situs Anda dan tidak ditulis oleh Anda.Menjelajahi semua situs web perpustakaan, mengunduh dan membongkar arsip, menyalin file ke dalam proyek - semua ini diganti dengan beberapa perintah di terminal.
NPM
kependekan:Node JS package manager
membantu Anda mengelola semua perpustakaan yang diandalkan oleh perangkat lunak Anda. Anda akan menentukan kebutuhan Anda dalam file yang dipanggilpackage.json
dan dijalankannpm install
di baris perintah ... lalu BANG, paket Anda diunduh dan siap digunakan. Dapat digunakan baik untukfront-end and back-end
perpustakaan.Bower
: untuk manajemen paket front-end, konsepnya sama dengan NPM. Semua perpustakaan Anda disimpan dalam file bernamabower.json
dan kemudian jalankanbower install
di baris perintah.NPM
Punjung
Yarn
: Seorang manajer paket baru untukJavaScript
diterbitkan olehFacebook
baru-baru ini dengan beberapa kelebihan dibandingkan denganNPM
. Dan dengan Benang, Anda masih bisa menggunakan keduanyaNPM
danBower
mendaftar untuk mengambil paket. Jika Anda telah menginstal paket sebelumnya,yarn
buat salinan dalam tembolok yang memudahkanoffline package installs
.jspm
: adalah manajer paket untukSystemJS
pemuat modul universal, dibangun di atasES6
pemuat modul dinamis . Ini bukan manajer paket yang sama sekali baru dengan seperangkat aturannya sendiri, melainkan bekerja di atas sumber paket yang ada. Di luar kotak, ia bekerja denganGitHub
dannpm
. Karena sebagian besarBower
paket berbasiskanGitHub
, kita dapat menginstal paket-paket itujspm
juga. Ini memiliki registri yang mencantumkan sebagian besar paket front-end yang umum digunakan untuk instalasi yang lebih mudah.2. Modul Loader / Bundling
Sebagian besar proyek dalam skala apa pun akan memecah kode di antara sejumlah file. Anda hanya dapat memasukkan setiap file dengan
<script>
tag individual , namun,<script>
membuat koneksi http baru, dan untuk file kecil - yang merupakan tujuan modularitas - waktu untuk mengatur koneksi dapat memakan waktu lebih lama secara signifikan daripada mentransfer data. Saat skrip sedang mengunduh, tidak ada konten yang dapat diubah pada halaman.Misalnya
Misalnya
Komputer dapat melakukan itu lebih baik daripada yang Anda bisa, dan itulah sebabnya Anda harus menggunakan alat untuk secara otomatis menggabungkan segala sesuatu menjadi satu file.
Lalu kami mendengar tentang
RequireJS
,Browserify
,Webpack
danSystemJS
RequireJS
: adalahJavaScript
pemuat file dan modul. Hal ini dioptimalkan untuk digunakan dalam browser, tetapi dapat digunakan dalam lingkungan lainnya JavaScript, sepertiNode
.Misalnya: myModule.js
Di
main.js
, kita dapat mengimpormyModule.js
sebagai dependensi dan menggunakannya.Dan kemudian di
HTML
, kita dapat merujuk untuk digunakan bersamaRequireJS
.Browserify
: ditetapkan untuk memungkinkan penggunaanCommonJS
modul yang diformat di browser. Akibatnya,Browserify
tidak sebanyak pemuat modul sebagai bundler modul:Browserify
sepenuhnya alat build-time, menghasilkan bundel kode yang kemudian dapat dimuat di sisi klien.Mulai dengan mesin build yang simpul & npm terpasang, dan dapatkan paketnya:
Tulis modul Anda dalam
CommonJS
formatDan ketika senang, keluarkan perintah untuk bundel:
Browserify secara rekursif menemukan semua dependensi entry-point dan mengumpulkannya menjadi satu file:
Webpack
: Ini mengelompokkan semua aset statis Anda, termasukJavaScript
, gambar, CSS, dan lainnya, menjadi satu file. Ini juga memungkinkan Anda untuk memproses file melalui berbagai jenis loader. Anda dapat menulis sintaksisJavaScript
denganCommonJS
atauAMD
modul Anda. Ini menyerang masalah pembangunan dengan cara yang secara fundamental lebih terintegrasi dan berpendapat. DalamBrowserify
Anda menggunakanGulp/Grunt
dan daftar panjang transformasi dan plugin untuk menyelesaikan pekerjaan.Webpack
menawarkan daya yang cukup di luar kotak yang biasanya tidak Anda butuhkanGrunt
atau tidakGulp
sama sekali.Penggunaan dasar sangat sederhana. Instal Webpack seperti Browserify:
Dan berikan perintah titik masuk dan file output:
SystemJS
: adalah pemuat modul yang dapat mengimpor modul pada waktu berjalan dalam salah satu format populer yang digunakan hari ini (CommonJS, UMD, AMD, ES6
). Itu dibangun di atasES6
polyfill loader modul dan cukup pintar untuk mendeteksi format yang digunakan dan menanganinya dengan tepat.SystemJS
juga dapat mengubah kode ES6 (denganBabel
atauTraceur
) atau bahasa lain sepertiTypeScript
danCoffeeScript
menggunakan plugin.3. Pelari tugas
Pelari tugas dan alat bangun terutama adalah alat baris perintah. Mengapa kita perlu menggunakannya: Dalam satu kata: otomatisasi . Semakin sedikit pekerjaan yang harus Anda lakukan ketika melakukan tugas yang berulang seperti minifikasi, kompilasi, pengujian unit, linting yang sebelumnya menghabiskan banyak waktu dengan baris perintah atau bahkan secara manual.
Grunt
: Anda dapat membuat otomatisasi untuk lingkungan pengembangan Anda untuk pra-proses kode atau membuat skrip build dengan file konfigurasi dan tampaknya sangat sulit untuk menangani tugas yang kompleks. Populer dalam beberapa tahun terakhir.Setiap tugas dalam
Grunt
adalah susunan konfigurasi plugin yang berbeda, yang hanya dijalankan satu demi satu, secara independen, dan berurutan.Gulp
: Otomasi persis sepertiGrunt
tetapi alih-alih konfigurasi, Anda dapat menulisJavaScript
dengan aliran seperti itu adalah aplikasi simpul. Lebih suka hari ini.Ini adalah
Gulp
deklarasi tugas sampel.4. Alat perancah
Slush and Yeoman
: Anda dapat membuat proyek pemula dengan mereka. Misalnya, Anda berencana untuk membuat prototipe dengan HTML dan SCSS, daripada membuat folder seperti scss, css, img, font secara manual. Anda cukup menginstalyeoman
dan menjalankan skrip sederhana. Maka semuanya ada di sini untuk Anda.Temukan lebih lanjut di sini .
Jawaban saya tidak benar-benar cocok dengan konten pertanyaan tetapi ketika saya mencari pengetahuan ini di Google, saya selalu melihat pertanyaan di atas sehingga saya memutuskan untuk menjawabnya secara ringkas. Semoga kalian bermanfaat.
sumber
OK, mereka semua punya beberapa kesamaan, mereka melakukan hal yang sama untuk Anda dengan cara yang berbeda dan serupa, saya membaginya dalam 3 kelompok utama seperti di bawah ini:
1) Modul bundlers
webpack dan browser sebagai yang populer, bekerja seperti pelari tugas tetapi dengan lebih banyak fleksibilitas, juga akan menggabungkan semuanya sebagai pengaturan Anda, sehingga Anda dapat menunjuk ke hasilnya sebagai bundle.js misalnya dalam satu file tunggal termasuk CSS dan Javascript, untuk lebih detail masing-masing, lihat detail di bawah:
paket web
lebih lanjut di sini
browserify
lebih lanjut di sini
2) Pelari tugas
tegukan dan gerutuan adalah pelari tugas, pada dasarnya apa yang mereka lakukan, membuat tugas dan menjalankannya kapan pun Anda mau, misalnya Anda menginstal plugin untuk memperkecil CSS Anda dan kemudian menjalankannya setiap kali melakukan minifying, rincian lebih lanjut tentang masing-masing:
teguk
lebih lanjut di sini
mendengus
lebih lanjut di sini
3) Manajer paket
manajer paket, yang mereka lakukan adalah mengelola plugin yang Anda butuhkan di aplikasi Anda dan menginstalnya untuk Anda melalui github dll menggunakan package.json, sangat mudah untuk memperbarui modul Anda, menginstalnya dan berbagi aplikasi Anda di seluruh, lebih detail untuk masing-masing:
npm
lebih lanjut di sini
punjung
lebih lanjut di sini
dan manajer paket terbaru yang tidak boleh dilewatkan, masih muda dan cepat di lingkungan kerja nyata dibandingkan dengan npm yang kebanyakan saya gunakan sebelumnya, untuk menginstal ulang modul, itu memeriksa folder folder node_modules untuk memeriksa keberadaan modul, tampaknya juga menginstal modul membutuhkan waktu lebih sedikit:
benang
lebih lanjut di sini
sumber
Anda dapat menemukan beberapa perbandingan teknis di npmcompare
Membandingkan browserify vs grunt vs gulp vs webpack
Seperti yang Anda lihat, webpack dikelola dengan sangat baik dengan versi baru yang keluar rata-rata setiap 4 hari. Tapi Gulp tampaknya memiliki komunitas terbesar di antara mereka semua (dengan lebih dari 20 ribu bintang di Github) Grunt tampaknya agak terabaikan (dibandingkan dengan yang lain)
Jadi, jika perlu memilih satu dari yang lain saya akan pergi dengan Gulp
sumber
Catatan kecil tentang npm: npm3 mencoba menginstal dependensi dengan cara datar
https://docs.npmjs.com/how-npm-works/npm3#npm-v3-dependency-resolution
sumber
dedupe
opsi untuk melakukan hal yang samawebpack-dev-server adalah server web pemuatan langsung yang digunakan pengembang Webpack untuk mendapatkan umpan balik langsung apa yang mereka lakukan. Seharusnya hanya digunakan selama pengembangan.
Proyek ini sangat terinspirasi oleh alat uji unit nof5 .
Webpack sesuai namanya akan menciptakan usia paket TUNGGAL untuk web . Paket ini akan diminimalkan, dan digabungkan menjadi satu file (kita masih hidup dalam usia HTTP 1.1). Webpack melakukan keajaiban menggabungkan sumber daya (JavaScript, CSS, gambar) dan menyuntikkan mereka seperti ini: .
<script src="assets/bundle.js"></script>
Itu juga bisa disebut modul bundler karena ia harus memahami dependensi modul, dan bagaimana cara mengambil dependensi dan menggabungkannya.
Anda bisa menggunakan Browserify pada tugas yang sama persis di mana Anda akan menggunakan Webpack . - Webpack lebih ringkas.
Perhatikan bahwa fitur pemuat modul ES6 di Webpack2 menggunakan System.import , yang tidak didukung oleh satu browser pun secara asli.
Anda bisa melupakan Gulp, Grunt, Brokoli, Brunch dan Bower . Sebagai gantinya, gunakan skrip baris perintah npm dan Anda dapat menghilangkan paket tambahan seperti ini di sini untuk Gulp :
Anda mungkin dapat menggunakan generator file config Gulp dan Grunt saat membuat file config untuk proyek Anda. Dengan cara ini Anda tidak perlu menginstal Yeoman atau alat serupa.
sumber
Yarn adalah manajer paket terbaru yang mungkin layak disebutkan.
Jadi, ini dia: https://yarnpkg.com/
Sejauh yang saya tahu dapat mengambil dependensi npm dan bower dan memiliki fitur lainnya yang dihargai.
sumber
Webpack
adalah bundler. SepertiBrowserfy
yang terlihat di basis kode untuk permintaan modul (require
atauimport
) dan menyelesaikannya secara rekursif. Terlebih lagi, Anda dapat mengkonfigurasiWebpack
untuk menyelesaikan tidak hanya modul seperti JavaScript, tetapi CSS, gambar, HTML, semuanya secara harfiah. Apa yang terutama membuat saya bersemangatWebpack
, Anda dapat menggabungkan kedua modul yang dikompilasi dan dimuat secara dinamis di aplikasi yang sama. Dengan demikian orang mendapatkan peningkatan kinerja nyata, terutama melalui HTTP / 1.x. Bagaimana tepatnya Anda melakukannya, saya jelaskan dengan contoh di sini http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Sebagai alternatif untuk bundler yang dapat dipikirkan orangRollup.js
( https://rollupjs.org/ ) , yang mengoptimalkan kode selama kompilasi, tetapi menghapus semua potongan yang tidak digunakan yang ditemukan.Sebab
AMD
, alih-alihRequireJS
seseorang dapat menggunakan asliES2016 module system
, tetapi dimuat denganSystem.js
( https://github.com/systemjs/systemjs )Selain itu, saya akan menunjukkan bahwa
npm
sering digunakan sebagai alat otomatisasi sepertigrunt
ataugulp
. Lihat https://docs.npmjs.com/misc/scripts . Saya pribadi pergi sekarang dengan skrip npm hanya menghindari alat otomatisasi lainnya, meskipun di masa lalu saya sangat menyukaigrunt
. Dengan alat lain Anda harus bergantung pada plugin yang tak terhitung jumlahnya untuk paket, yang sering tidak ditulis dengan baik dan tidak dipelihara secara aktif.npm
mengetahui paket-paketnya, jadi Anda menelepon ke salah satu paket yang diinstal secara lokal dengan nama seperti:Sebenarnya Anda sebagai aturan tidak memerlukan plugin apa pun jika paket mendukung CLI.
sumber