什麼是ejs
類比handlebars.js、artTemplate、jade這些模板引擎等,ejs也是一個javascript模板引擎,這裏就不比較它與其他模板引擎的性能做對比了,ejs語法過於樸實,如果你會寫html和簡單的JavaScript,或者你用jsx寫過react,那麼ejs對你來講將輕而易舉。只需簡單的兩步:
- 將%標籤包裹的js語法寫在html裏
-
將html後綴的文件後綴名替換成ejs
它與nodejs結合開發web網站簡直天作之合,因為它是基於node生態的模板,只需簡單的配置,即可運行在node項目中。ejs將模板與數據有效結合在一起,快速高效的構建html頁面。可以將每一個ejs當做一個html或者組件來使用,具體ejs的語法使用可以查看 ejs文檔實戰
第一步:使用koa來搭建一個server
首先初始化項目,在終端依次執行
npm init npm install koa新建
app.js入口文件,代碼如下:const koa = require('koa') const app = new koa() app.use(async(ctx, next) => { console.log(ctx.request.path) if (ctx.request.path === '/index') { // 首頁 ctx.response.status = 200 ctx.response.body = 'index' } else if (ctx.request.path === '/hello') { // hello頁 ctx.response.status = 200 ctx.response.body = 'hello world' } else { ctx.throw(404, 'Not found') // 404 } await next() }) app.listen(3000, function() { console.log('koa應用啓動!') })以上代碼所示,根據參數ctx的獲取所訪問的path路徑,然後分別對不同的路徑進行處理
終端運行
npm app.js
啓動koa服務看到如下效果:
這是一個簡單的koa項目,監聽3000端開啓node服務,index頁面和hello頁面分別展示不同的內容。第一步已經完成,接下來只需將ejs模板引擎集成到koa項目裏就可以了。
第二步:集成ejs模板引擎
新建一個views目錄,在此目錄下放置所有的ejs模板文件,作為演示,我們先新建一個index.ejs,這時koa還不能識別ejs後綴的文件,我們需要藉助app.use將ejs後綴的文件註冊進入,將koa與views目錄下的所有ejs後綴文件關聯起來。
首先install一下koa-views
npm install koa-views
在app.js內增加以下代碼:
const path = require('path')
const views = require('koa-views');
app.use(views(path.join(__dirname, './views'), { extension: 'ejs' }))
並修改以下代碼
app.use(async(ctx, next) => {
console.log(ctx.request.path)
if (ctx.request.path === '/index') { // 首頁
// ctx.response.status = 200
// ctx.response.body = 'index'
await ctx.render('index')
} else if (ctx.request.path === '/hello') { // hello頁
ctx.response.status = 200
ctx.response.body = 'hello world'
} else {
ctx.throw(404, 'Not found') // 404
}
await next()
})
ctx.render('index')將index.ejs渲染成html文件,如圖:
重新運行npm app.js,啓動服務,重新刷新index頁面,會看到ejs模板已經被編譯成一個html頁面,如下圖:
將koa+ejs運用在實際項目中
如果需要快速建站,這個是一個不錯的方案,可以使用koa,那當然也可以使用node或者express框架,因為ejs就是node生態的一部分,所以使用任意node框架都可以。在實際項目中,我們可能會用到koa-router來管理多個路由,在每個路由內render對應的ejs文件,如圖所示:
demo示例
以上只是介紹如何簡單快速的搭建靜態web網站,我們實際項目中的頁面會更多更復雜,不只有靜態頁面,也會存在表單、列表等大批的頁面需要與接口對接聯調,因此也會有一些ejs模板需要做動態化處理,當然ejs模板語法也是支持的。針對如何獲取動態數據,渲染動態頁面,這裏提供兩種方案:
- 後端node服務直接連接數據庫,查詢數據後返回到ejs頁面,根據ejs語法,我們從路由處拿到變量後渲染在ejs模板內;這時,整個node項目前後端是不分離的,node既做後端服務,又做前端渲染,如果是複雜的項目,開發人員的開發量可能比較大,當然對於全棧開發工程師或者創業型公司,這些都不在話下。
- 也可以在路由內使用request庫(如ajax、axios、http、fetch)第三方接口請求,拿到數據直接渲染在ejs模板內,這樣的好處都是可以做到前後端開發分離,可以將這個node項目交給前端開發者,後端技術棧沒有限制,前端只需要像開發vue項目一樣調取接口就可以了。但是這樣的弊端就是如果接口加載過慢,會導致整個ejs頁面白屏,所以採用此方案需要格外注意渲染和加載調優。