Saya menggunakan kerangka kerja ExpressJS untuk NodeJS.
Orang yang menggunakan ExpressJS menempatkan lingkungan mereka (pengembangan, produksi, pengujian ...), rute mereka dll pada app.js
. Saya pikir itu bukan cara yang indah karena ketika Anda memiliki aplikasi besar, app.js terlalu besar!
Saya ingin memiliki struktur direktori ini:
| my-application
| -- app.js
| -- config/
| -- environment.js
| -- routes.js
Ini kode saya:
app.js
var express = require('express');
var app = module.exports = express.createServer();
require('./config/environment.js')(app, express);
require('./config/routes.js')(app);
app.listen(3000);
config / environment.js
module.exports = function(app, express){
app.configure(function() {
app.use(express.logger());
});
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
};
config / route.js
module.exports = function(app) {
app.get('/', function(req, res) {
res.send('Hello world !');
});
};
Kode saya berfungsi dengan baik dan saya pikir struktur direktori itu indah. Namun, kode harus diadaptasi dan saya tidak yakin itu bagus / cantik.
Apakah lebih baik menggunakan struktur direktori saya dan mengadaptasi kode atau hanya menggunakan satu file (app.js)?
Terima kasih atas saran Anda!
Jawaban:
OK, sudah lama dan ini adalah pertanyaan yang populer, jadi saya sudah maju dan membuat repositori github perancah dengan kode JavaScript dan README panjang tentang bagaimana saya ingin menyusun aplikasi express.js berukuran sedang.
focusaurus / express_code_structure adalah repo dengan kode terbaru untuk ini. Permintaan tarik diterima.
Ini snapshot README karena stackoverflow tidak menyukai jawaban hanya tautan. Saya akan membuat beberapa pembaruan karena ini adalah proyek baru yang akan saya terus perbarui, tetapi akhirnya repo github akan menjadi tempat terbaru untuk informasi ini.
Struktur Kode Ekspres
Proyek ini adalah contoh bagaimana mengatur aplikasi web express.js berukuran sedang.
Saat ini untuk setidaknya mengekspresikan v4.14 Desember 2016
Seberapa besar aplikasi Anda?
Aplikasi web tidak semuanya sama, dan menurut saya, tidak ada struktur kode tunggal yang harus diterapkan untuk semua aplikasi express.js.
Jika aplikasi Anda kecil, Anda tidak perlu struktur direktori yang dalam seperti yang dicontohkan di sini. Tetap sederhana dan tempelkan beberapa
.js
file di root repositori Anda dan Anda selesai. Voa.Jika aplikasi Anda besar, pada titik tertentu Anda perlu memecahnya menjadi paket npm yang berbeda. Secara umum pendekatan node.js tampaknya mendukung banyak paket kecil, setidaknya untuk pustaka, dan Anda harus membangun aplikasi Anda dengan menggunakan beberapa paket npm karena itu mulai masuk akal dan membenarkan overhead. Jadi ketika aplikasi Anda tumbuh dan sebagian kode menjadi jelas dapat digunakan kembali di luar aplikasi Anda atau merupakan subsistem yang jelas, pindahkan ke repositori git itu sendiri dan buatlah menjadi paket npm mandiri.
Jadi fokus dari proyek ini adalah untuk menggambarkan struktur yang bisa diterapkan untuk aplikasi berukuran sedang.
Apa arsitektur keseluruhan Anda
Ada banyak pendekatan untuk membangun aplikasi web, seperti
Masing-masing cocok dengan baik ke dalam struktur direktori yang berbeda. Untuk keperluan contoh ini, ini hanya perancah dan bukan aplikasi yang berfungsi penuh, tapi saya mengasumsikan poin arsitektur utama berikut:
Dan bagaimana dengan Ruby on Rails?
Ini akan menjadi tema di seluruh proyek ini bahwa banyak ide yang terkandung dalam Ruby on Rails dan keputusan "Konvensi Konfigurasi" yang telah mereka adopsi, meskipun diterima dan digunakan secara luas, sebenarnya tidak terlalu membantu dan kadang-kadang berlawanan dengan apa yang ada dalam repositori ini. merekomendasikan.
Poin utama saya di sini adalah bahwa ada prinsip-prinsip yang mendasari untuk mengatur kode, dan berdasarkan prinsip-prinsip itu, konvensi Ruby on Rails masuk akal (kebanyakan) untuk komunitas Ruby on Rails. Namun, hanya dengan menipu saja, konvensi-konvensi itu tidak tepat sasaran. Setelah Anda memahami prinsip-prinsip dasar, SEMUA proyek Anda akan terorganisir dengan baik dan jelas: skrip shell, game, aplikasi seluler, proyek perusahaan, bahkan direktori home Anda.
Untuk komunitas Rails, mereka ingin dapat memiliki satu pengembang Rails beralih dari satu aplikasi ke aplikasi dan menjadi akrab dan nyaman dengan itu setiap kali. Ini masuk akal jika Anda 37 sinyal atau Lab Penting, dan memiliki manfaat. Di dunia JavaScript sisi-server, etos keseluruhan hanyalah cara yang semakin liar dan kita tidak benar-benar memiliki masalah dengan itu. Begitulah cara kami menggulung. Kami sudah terbiasa. Bahkan di dalam express.js, ia adalah keluarga dekat Sinatra, bukan Rails, dan mengambil konvensi dari Rails biasanya tidak membantu apa pun. Saya bahkan akan mengatakan Principles over Convention over Configuration .
Prinsip dan Motivasi yang Mendasari
app/node_modules
direktori dan memilikipackage.json
file dalam direktori proto-module untuk memfasilitasi transisi itu dan bertindak sebagai pengingat.app
direktori sehingga Anda dapatcd
menjalankan run / grep / xargs / ag / ack / etc dan tidak terganggu oleh pertandingan pihak ketigakebab-case
meskipun nama variabel untuk itu dalam JavaScript haruscamelCase
karena-
merupakan tanda minus dalam JavaScript.kebab-case
ditransformasikan menjadicamelCase
app/views
,app/controllers
,app/models
, dllroutes.rb
File gaya rel berguna jika Anda menginginkan ikhtisar semua rute di aplikasi, tetapi ketika benar-benar membangun fitur dan memperbaiki bug, Anda hanya peduli dengan rute yang relevan dengan bagian yang Anda ubah.app/users
karena tidak ada sarang tikus dari logika bisnis ditambah di semua tempat yang mencemari kemurnian basis kode pengguna.app/server.js:1
dan Anda dapat melihat semua yang dimuat dan dijalankan dengan mengikuti kode.magicRESTRouter.route(somecontroller, {except: 'POST'})
adalah kemenangan besar bagi Anda lebih dari 3 dasarapp.get
,app.put
,app.del
, panggilan, Anda mungkin membangun aplikasi monolitik yang terlalu besar untuk secara efektif bekerja pada. Dapatkan mewah untuk kemenangan BESAR, bukan untuk mengonversi 3 baris sederhana menjadi 1 baris kompleks.Gunakan nama file huruf kecil kebab
spesifik express.js
Jangan gunakan
app.configure
. Ini hampir seluruhnya tidak berguna dan Anda hanya tidak membutuhkannya. Ada banyak boilerplate karena copypasta yang tidak ada artinya.app.use
untuk seluruh aplikasi Anda jika Anda benar-benar hanya membutuhkan middleware untuk 2 rute (Saya melihat Anda,body-parser
)server.js
dan akan jelas bagaimana mereka dipesan. Untuk aplikasi berukuran sedang, membagi hal-hal ke dalam modul rute terpisah itu bagus, tetapi hal itu memperkenalkan bahaya middleware rusakTrik symlink aplikasi
Ada banyak pendekatan yang diuraikan dan dibahas panjang lebar oleh masyarakat dalam inti besar baik lokal memerlukan () jalur untuk Node.js . Saya mungkin segera memutuskan untuk memilih "hanya berurusan dengan banyak ../../../ .." atau menggunakan memerlukan dari mode. Namun, saat ini, saya telah menggunakan trik symlink yang dirinci di bawah ini.
Jadi salah satu cara untuk menghindari kebutuhan dalam proyek dengan jalur relatif yang mengganggu seperti
require("../../../config")
adalah dengan menggunakan trik berikut:.gitignore
file Andavar config = require("app/config");
var DealModel = require("app/deals/deal-model")
;Konfigurasi
Umumnya kode modul dan kelas untuk mengharapkan hanya
options
objek JavaScript dasar yang diteruskan. Hanyaapp/server.js
harus memuatapp/config.js
modul. Dari sana dapat mensintesisoptions
objek kecil untuk mengkonfigurasi subsistem yang diperlukan, tetapi menyambungkan setiap subsistem ke modul konfigurasi global besar yang penuh dengan informasi tambahan adalah kopling yang buruk.Cobalah untuk memusatkan pembuatan koneksi DB dan mengirimkannya ke dalam subsistem yang bertentangan dengan melewati parameter koneksi dan membuat subsistem membuat koneksi keluar sendiri.
NODE_ENV
Ini adalah ide lain yang menarik tetapi mengerikan yang dibawa dari Rails. Seharusnya ada 1 tempat di aplikasi Anda,
app/config.js
yang terlihat padaNODE_ENV
variabel lingkungan. Segala sesuatu yang lain harus mengambil opsi eksplisit sebagai argumen konstruktor kelas atau parameter konfigurasi modul.Jika modul email memiliki opsi tentang cara mengirim email (SMTP, masuk ke stdout, masukkan antrian, dll), ia harus mengambil opsi seperti
{deliver: 'stdout'}
tetapi sama sekali tidak perlu memeriksaNODE_ENV
.Tes
Sekarang saya menyimpan file pengujian saya di direktori yang sama dengan kode yang sesuai dan menggunakan konvensi penamaan ekstensi nama file untuk membedakan tes dari kode produksi.
foo.js
memiliki kode "foo" modulfoo.tape.js
memiliki tes berbasis simpul untuk foo dan tinggal di dir yang samafoo.btape.js
dapat digunakan untuk tes yang perlu dijalankan di lingkungan browserSaya menggunakan gumpalan filesystem dan
find . -name '*.tape.js'
perintah untuk mendapatkan akses ke semua pengujian saya sebagaimana diperlukan.Cara mengatur kode dalam setiap
.js
file modulCakupan proyek ini kebanyakan tentang ke mana file dan direktori pergi, dan saya tidak ingin menambahkan banyak ruang lingkup lain, tetapi saya hanya akan menyebutkan bahwa saya mengatur kode saya menjadi 3 bagian yang berbeda.
sumber
UPDATE (2013-10-29) : Silakan lihat jawaban saya yang lain yang memiliki JavaScript alih-alih CoffeeScript berdasarkan permintaan populer serta repo boilerplate github dan README luas yang merinci rekomendasi terbaru saya tentang topik ini.
Konfigurasi
Apa yang Anda lakukan baik-baik saja. Saya ingin mengatur namespace konfigurasi saya sendiri di
config.coffee
file tingkat atas dengan namespace bersarang seperti ini.Ini ramah untuk pengeditan sysadmin. Lalu ketika saya membutuhkan sesuatu, seperti info koneksi DB, itu `s
Rute / Pengendali
Saya suka meninggalkan rute saya dengan pengontrol saya dan mengaturnya dalam sebuah
app/controllers
subdirektori. Lalu saya dapat memuatnya dan membiarkan mereka menambahkan rute apa pun yang mereka butuhkan.Dalam
app/server.coffee
file kopi saya, saya lakukan:Jadi saya punya file seperti:
Dan misalnya di pengontrol domain saya, saya memiliki
setup
fungsi seperti ini.Tampilan
Menempatkan pandangan di
app/views
menjadi tempat adat. Saya paparkan seperti ini.File Statis
Masuk a
public
subdirektori.Github / Semver / NPM
Letakkan file markdown README.md di root git repo Anda untuk github.
Letakkan file package.json dengan nomor versi semantik di root git repo Anda untuk NPM.
sumber
app.put route, api.needId
Go
dan memasukkanbin
file ke dalam struktur. Bagaimana Anda menjalankango
file itubin
?Berikut ini adalah jawaban Peter Lyons kata demi kata, dipindahkan ke vanilla JS dari Coffeescript, seperti yang diminta oleh beberapa orang lain. Jawaban Peter sangat bisa, dan siapa pun yang memilih jawaban saya harus memilihnya juga.
Konfigurasi
Apa yang Anda lakukan baik-baik saja. Saya ingin mengatur namespace konfigurasi saya sendiri di
config.js
file tingkat atas dengan namespace bersarang seperti ini.Ini ramah untuk pengeditan sysadmin. Lalu ketika saya membutuhkan sesuatu, seperti info koneksi DB, itu `s
Rute / Pengendali
Saya suka meninggalkan rute saya dengan pengontrol dan mengaturnya dalam
app/controllers
subdirektori. Lalu saya dapat memuatnya dan membiarkan mereka menambahkan rute apa pun yang mereka butuhkan.Dalam
app/server.js
file javascript saya, saya lakukan:Jadi saya punya file seperti:
Dan misalnya di pengontrol domain saya, saya memiliki
setup
fungsi seperti ini.Tampilan
Menempatkan pandangan di
app/views
menjadi tempat adat. Saya paparkan seperti ini.File Statis
Buka
public
subdirektori.Github / Semver / NPM
Letakkan file markdown README.md di root git repo Anda untuk github.
Letakkan file package.json dengan nomor versi semantik di root git repo Anda untuk NPM.
sumber
Pertanyaan saya diperkenalkan pada bulan April 2011, sudah tua tenang. Selama ini, saya bisa meningkatkan pengalaman saya dengan Express.js dan bagaimana membuat arsitektur aplikasi yang ditulis menggunakan perpustakaan ini. Jadi, saya berbagi pengalaman saya di sini.
Inilah struktur direktori saya:
App.js
Tujuan dari
app.js
file ini adalah untuk mem-bootstrap aplikasi expressjs. Itu memuat modul konfigurasi, modul logger, menunggu koneksi database, ..., dan menjalankan server ekspres.rute /
Direktori rute memiliki
index.js
file. Tujuannya adalah untuk memperkenalkan semacam sihir untuk memuat semua file lain di dalamroutes/
direktori. Inilah implementasinya:Dengan modul itu, membuat definisi rute baru dan implementasi sangat mudah. Untuk contoh,
hello.js
:Setiap modul rute adalah mandiri .
sumber
Saya suka menggunakan "aplikasi" global, daripada mengekspor fungsi dll
sumber
Saya pikir ini cara yang bagus untuk melakukannya. Tidak terbatas untuk mengekspresikan tetapi saya telah melihat cukup banyak proyek node.js di github melakukan hal yang sama. Mereka mengeluarkan parameter konfigurasi + modul yang lebih kecil (dalam beberapa kasus setiap URI) diperhitungkan dalam file terpisah.
Saya akan merekomendasikan melalui proyek kilat khusus pada github untuk mendapatkan ide. IMO seperti yang Anda lakukan benar.
sumber
sekarang adalah Akhir 2015 dan setelah mengembangkan struktur saya selama 3 tahun dan dalam proyek-proyek kecil dan besar. Kesimpulan?
Jangan melakukan satu MVC besar, tetapi pisahkan dalam modul
Begitu...
Mengapa?
Biasanya satu bekerja pada satu modul (misalnya Produk), yang dapat Anda ubah secara independen.
Anda dapat menggunakan kembali modul
Anda dapat mengujinya secara terpisah
Anda dapat menggantinya secara terpisah
Mereka memiliki antarmuka yang jelas (stabil)
-Pada terbaru, jika ada beberapa pengembang bekerja, pemisahan modul membantu
Proyek nodebootstrap memiliki pendekatan yang mirip dengan struktur akhir saya. ( github )
Bagaimana struktur ini terlihat?
Modul-modul kecil yang diberi kapsul , masing-masing dengan MVC yang terpisah
Setiap modul memiliki package.json
Pengujian sebagai bagian dari struktur (dalam setiap modul)
Konfigurasi global , perpustakaan, dan Layanan
Docker Terintegrasi, Cluster, selamanya
Folderoverview (lihat folder lib untuk modul):
sumber
Saya memberikan struktur folder gaya MVC, silakan temukan di bawah.
Kami menggunakan struktur folder di bawah ini untuk aplikasi web besar dan sedang kami.
Saya telah membuat satu modul npm untuk pembuatan folder folder mvc express.
Silakan temukan di bawah https://www.npmjs.com/package/express-mvc-generator
Hanya langkah-langkah sederhana untuk menghasilkan dan menggunakan modul ini.
i) memasang modul
npm install express-mvc-generator -g
ii) periksa opsi
express -h
iii) Hasilkan struktur mvc ekspres
express myapp
iv) Instal dependensi:
npm install
::v) Buka config / database.js Anda, Konfigurasikan mongo db Anda.
vi) Jalankan aplikasi
node app
ataunodemon app
vii) Periksa URL http: // localhost: 8042 / daftar ATAU http: // yourip: 8042 / daftar
sumber
Sudah cukup lama sejak jawaban terakhir untuk pertanyaan ini dan Express juga baru-baru ini merilis versi 4, yang menambahkan beberapa hal berguna untuk mengatur struktur aplikasi Anda.
Di bawah ini adalah posting blog yang panjang dan terkini tentang praktik terbaik tentang cara menyusun aplikasi Express Anda. http://www.terlici.com/2014/08/25/best-practices-express-structure.html
Ada juga repositori GitHub yang menerapkan saran dalam artikel. Selalu up to date dengan versi Express terbaru.
https://github.com/terlici/base-express
sumber
Saya tidak berpikir itu pendekatan yang baik untuk menambahkan rute ke konfigurasi. Struktur yang lebih baik bisa seperti ini:
Jadi products.js dan users.js akan berisi semua rute Anda akan semua logika di dalamnya.
sumber
Yah saya meletakkan rute saya sebagai file json, yang saya baca di awal, dan dalam for-loop di app.js mengatur rute. Route.json termasuk tampilan mana yang harus dipanggil, dan kunci untuk nilai-nilai yang akan dikirim ke rute.
Ini berfungsi untuk banyak kasus sederhana, tetapi saya harus secara manual membuat beberapa rute untuk kasus khusus.
sumber
Saya telah menulis posting tentang hal ini. Ini pada dasarnya menggunakan
routeRegistrar
file yang di-iterates melalui folder yang/controllers
memanggil fungsinyainit
. Functioninit
mengambilapp
variabel express sebagai parameter sehingga Anda bisa mendaftarkan rute Anda seperti yang Anda inginkan.sumber
Ini mungkin menarik:
https://github.com/flatiron/nconf
sumber
1) Sistem file proyek Express Anda mungkin seperti:
app.js - Anda wadah aplikasi global
2) File utama modul (lib / mymodule / index.js):
3) Hubungkan modul di app.js utama
4) Contoh logika
tj mengatakan / tunjukkan pada Vimeo ide menarik bagaimana memodulasi aplikasi ekspres - aplikasi web modular dengan Node.js dan Express . Kuat dan sederhana.
sumber
http://locomotivejs.org/ menyediakan cara untuk menyusun aplikasi yang dibangun dengan Node.js dan Express.
Dari situs web:
sumber
Saya baru-baru memeluk modul sebagai mini-aplikasi independen.
Sekarang untuk setiap perutean modul (# .js), pandangan (* .ejs), js, css dan aset bersebelahan. perutean submodule diatur di induk # .js dengan dua baris tambahan
Dengan cara ini, bahkan sub-modul mungkin.
Jangan lupa untuk mengatur tampilan ke direktori src
sumber
Ini adalah bagaimana sebagian besar struktur direktori proyek kilat saya terlihat.
Saya biasanya melakukan
express dirname
untuk menginisialisasi proyek, maafkan kemalasan saya, tetapi sangat fleksibel dan dapat diperpanjang. PS - Anda perlu mendapatkannyaexpress-generator
(untuk mereka yang mencarinyasudo npm install -g express-generator
, sudo karena Anda menginstalnya secara global)Anda pasti bertanya-tanya mengapa file .env? Karena mereka bekerja! Saya menggunakan
dotenv
modul dalam proyek saya (baru-baru ini) dan berfungsi! Masukkan 2 pernyataan ini diapp.js
atauwww
Dan baris lain untuk mengatur dengan cepat
/bower_components
untuk menyajikan konten statis di bawah sumber daya/ext
Mungkin bisa cocok untuk orang yang ingin menggunakan Express dan Angular bersama, atau hanya mengekspresikan tanpa
javascripts
hierarki itu tentu saja.sumber
Struktur saya ekspres 4. https://github.com/odirleiborgert/borgert-express-boilerplate
Paket
Struktur
sumber
Cara sederhana untuk menyusun aplikasi Anda:
Di index.js utama, urutan berikut harus dipertahankan.
sumber
Cara Terbaik Menuju Struktur MVC untuk Proyek ExpressJs dengan stang & Paspor
sumber