這種方式開發和配置起來稍微有點複雜,這裏先來說一下從零開始配置的方式:javascript
// 引入 express
const express = require('express');
const app = express();
// 定義一個路由
app.get('/', (req, res) => {
// 爲/路由發送一個響應消息
res.send('Hello World!');
})
// 開啓 http 服務,監聽 8080
app.listen(8080);
複製代碼
這是官方的標準示例,從零起步看起來很是簡單,但也是最無用的,由於你沒法用這些代碼作什麼事情。咱們還差一個東西,就是 HTML。這個怎麼來呢,有兩種方法。css
第一種:html
res.send('<h1>我是 h1 標籤</h1>');
複製代碼
由於 html 也是字符串,因此咱們能夠在響應消息中寫 html,這樣也能開發出一個網站來。但咱們不會這麼作,由於太不方便開發了,因此咱們有了第二種方法:使用模板引擎。前端
模板引擎是一種把你寫的相似於 html 的代碼轉換成標準 html 代碼的工具。java
模板引擎有不少種類,目的同樣,寫法不同,惟一不變的就是:每一個做者都認爲本身開發的模板引擎是最好的。做爲吃瓜羣衆,我不懂,也不敢問。react
你也不用處處找了,這個連接是 14 個 js 模板引擎的介紹: js 模板引擎介紹webpack
要使用模板引擎也很簡單,有兩種方法,一種是使用 ExpressJs 官方提供的一個框架生成工具:express-generator
。nginx
express-generator
$ yarn global add express-generator
// 或
$ npm i -g express-generator
複製代碼
# 使用默認模板
$ express my-app
# 經過幫助命令查看支持哪些模板
$ express -h
# 使用 pug 模板
$ express -v pug my-app
複製代碼
執行完畢後,一個包含模板引擎配置的框架就生成好了。git
另外一種就是express-generator
工具沒有集成進去的模板引擎,得看着手冊本身配。 好比我想要使用 React 模板,只能看着文檔本身配了。github
若是你作了很長時間的先後端分離開發,那麼退回到原始的 web 開發可能會有點不適應,舉個例子:
// pug 模板語法
button(class='div-class', onclick='play()') 按鈕
複製代碼
若是你但願 onclick 裏面的 play 函數要能執行的話,必須在 public 目錄下有一個能在瀏覽器下運行的 js 文件,而後再引入進來:
script(src='/javascripts/index.js')
複製代碼
由於模板引擎只是幫你把模板轉換爲 html 字符串,發送給了瀏覽器。
自從接觸了先後端分離的開發方式,再來看這種傳統的 web 開發,就感受開發起來很費勁,由於你得使用一套模板引擎才能讓你的工做看起來輕鬆些。這種開發方式隨着時間的推移我以爲會被慢慢地淘汰掉的。
在研究完 express 的傳統開發方式後,就把它給拋棄了,我們仍是得回到先後端分離的開發方式中來。
各開發方式仍是有點不同,
即:純前端 + 純後端
express 做爲後端服務,提供 api 接口。前端負責 html 頁面的開發,調接口。
因此就會有兩個服務:前端服務和後端服務。 這是目前最主流的開發方式,就不過多介紹了。
即:前端依賴後端服務
express 做爲後端服務的同時也做爲靜態服務負責渲染前端頁面。
這種方式我以爲比較有意思。
前端頁面開發完後,打包生成前端資源(html,js,css等),放到後端 express 的靜態目錄下,假設是 public 目錄:
public/
js/
css/
index.html
app.js
複製代碼
在 app.js 中:
const express = require('express');
const app = express();
// 使用 express.static 中間件來處理靜態資源
app.use(express.static(path.join(__dirname, 'public')));
app.listen(8080);
複製代碼
這樣就能夠了,若是你前端頁面是採用 React,Vue 或 Angular 等開發的,那麼你都無需設置任何路由。這種方式有點像 nginx 靜態服務。
若是須要 api,那麼就須要設置路由了。假設咱們把/api/
開頭的路徑都當作是接口服務:
// 使用專門的 api 路由來處理 api 請求
app.use('/api/', require('./routes/api.js'));
複製代碼
api.js 文件:
var express = require('express');
var router = express.Router();
// /api/user-list 接口
router.post('/user-list', function(req, res, next) {
// 接口邏輯
res.send('user');
});
module.exports = router;
複製代碼
啓動前端服務時,就能夠請求你自定義的接口了,這是一個典型的前端依賴後端服務的開發方式。
在開發前端頁面的時候,通常會開啓一個前端開發服務,好比使用 webpack-dev-server。那麼在開啓這個服務的時候,我還想使用一些 mock 庫來模擬接口來生成一些模擬數據要怎麼辦呢?
是有辦法的。
由於 webpack-dev-server 也使用 express,因此就可使用中間件來作這件事啦,仍是有兩種方式,第一種比較簡單,適合接口很少的狀況:
// 使用 app.post
devServer: {
before: function(app, server) {
// 對 /api/mock 的請求返回自定義數據
app.post('/api/mock', function(req, res) {
res.json({ custom: 'response' });
});
}
}
複製代碼
第二種呢稍微高級點,適合接口比較多的狀況:
const mockMiddleware = require('./mock-middleware');
// 使用 app.use
devServer: {
before: function(app, server) {
// 攔截全部 /api 開頭的請求,轉發到 mockMiddleware 中進一步處理
app.use('/api', mockMiddleware);
}
}
複製代碼
// mock-middleware.js
const express = require('express');
const router = express.Router();
// 響應 /api/mock 請求
router.post('/mock', function(req, res, next) {
res.json({
data: {
name: 123,
sex: 1,
}
})
})
module.exports = router;
複製代碼
這樣開啓前端服務的同時,你也能夠請求 mock 數據了。
我們還能夠再作的更高大上一點,好比咱們只須要寫 mock 配置,其他的事情則由別的工具來作:
// mock 配置文件
module.exports = {
'POST /api/user-list': [
{
name: '張三',
age: 13,
},
{
name: '李四',
age: 12,
}
],
'POST /api/user/123': {
// ...
}
}
複製代碼
咱們只須要在一個專門用來存放 mock 的地方配置好 mock 數據,其它工具對這種數據先預解析一遍,最後會生成 app.post 之類的配置,目前網上就有這種工具,好比:功能強大的UmiJS
看完以上介紹,你是否已經對 express 開發 web 的方式有所認識和有所選擇了呢?若是我文章中還有描述不清楚的地方還請指出,我會繼續優化,先謝過了。