云開(kāi)發(fā)中的戰(zhàn)斗機(jī),火了!
你們有沒(méi)有想過(guò)像寫(xiě)文章一樣方便地寫(xiě)代碼呢?
怎樣才能像寫(xiě)文章一樣寫(xiě)代碼? 理想的需求應(yīng)該是可以在線編寫(xiě)、調(diào)試函數(shù),不用重啟服務(wù),隨時(shí)隨地在 Web 上查看函數(shù)的運(yùn)行日志,無(wú)需連接服務(wù)器,無(wú)需折騰數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)、Nginx 等,可以隨時(shí)隨地上線應(yīng)用,招之即來(lái),揮之即去,隨手發(fā)布!
這時(shí)候懂王上線了,好家伙,這不就是 Serverless 嘛,Serverless 的愿景是用戶(hù)只需專(zhuān)注開(kāi)發(fā)意圖,編寫(xiě)函數(shù)代碼,并上傳到代碼倉(cāng)庫(kù),其他的東西不需要關(guān)心,Serverless 平臺(tái)會(huì)自動(dòng)分配計(jì)算資源,并按需運(yùn)行函數(shù)。
你懂的真多,可惜啊,僅有 Serverless 還滿(mǎn)足不了上述需求。
要想像寫(xiě)文章一樣寫(xiě)代碼,除了需要 Serverless 來(lái)提供函數(shù)計(jì)算服務(wù)之外,還需要以下幾個(gè)必備條件:
云數(shù)據(jù)庫(kù):為應(yīng)用開(kāi)發(fā)提供開(kāi)箱即用的數(shù)據(jù)庫(kù)服務(wù); 云存儲(chǔ):為應(yīng)用開(kāi)發(fā)提供專(zhuān)業(yè)的文件對(duì)象存儲(chǔ)服務(wù),兼容 S3 和其他存儲(chǔ)服務(wù)接口; WebIDE:在線寫(xiě)代碼,完善的類(lèi)型提示、代碼自動(dòng)完成,隨手發(fā)布上線!
懂王又上線了,這個(gè)我也懂,騰訊云開(kāi)發(fā)、Google Firebase 以及 UniCloud 就提供這樣的功能。
如果我告訴你現(xiàn)在有一個(gè)平臺(tái)已經(jīng)俱備了上述的所有條件,而且完全開(kāi)源,每個(gè)開(kāi)發(fā)團(tuán)隊(duì)都可以隨時(shí)擁有一個(gè)自己的云開(kāi)發(fā)平臺(tái),你會(huì)不會(huì)內(nèi)心狂喜?
是的,這個(gè)平臺(tái)就是 Laf。
人生苦短,前端用 Laf,后端用 Laf,云開(kāi)發(fā)用戶(hù)用 Laf,獨(dú)立開(kāi)發(fā)者用 Laf,初創(chuàng)團(tuán)隊(duì)用 Laf,我也用 Laf。
上鏈接??:https://github.com/labring/laf
值得一提的是,Laf 在上周五一天內(nèi) Star 數(shù)量增長(zhǎng)了近 300 個(gè),并且后續(xù)連續(xù)幾天的 Star 數(shù)量呈垂直上升,簡(jiǎn)直就是簡(jiǎn)直了。

接下來(lái),跟大家詳細(xì)介紹下 Laf。

?? Laf 是什么?
Laf 本質(zhì)上是一個(gè)集「函數(shù)計(jì)算」、「數(shù)據(jù)庫(kù)」、「對(duì)象存儲(chǔ)」等于一身的一站式開(kāi)發(fā)平臺(tái),可以快速的開(kāi)發(fā)并發(fā)布應(yīng)用。它包含了以下幾個(gè)功能:
云函數(shù)
云函數(shù)是運(yùn)行在云端的 JavaScript 代碼,熟悉 Node.js 的開(kāi)發(fā)者可以直接上手。
云函數(shù)也可以使用 Typescript 編寫(xiě),無(wú)需管理服務(wù)器,在開(kāi)發(fā)控制臺(tái)在線編寫(xiě)、在線調(diào)試、一鍵保存即可運(yùn)行后端代碼。
在你的應(yīng)用中,大多數(shù)數(shù)據(jù)的獲取都可在客戶(hù)端直接操作數(shù)據(jù)庫(kù),但是通常業(yè)務(wù)中會(huì)使用到「非數(shù)據(jù)庫(kù)操作」,如注冊(cè)、登錄、文件操作、事務(wù)、第三方接口等,可直接使用云函數(shù)實(shí)現(xiàn)。
詳情請(qǐng)查看云函數(shù)的文檔。

云數(shù)據(jù)庫(kù)
前端可使用 laf-client-sdk “直連”云數(shù)據(jù)庫(kù),無(wú)需與服務(wù)端對(duì)接口。
通過(guò)在開(kāi)發(fā)控制臺(tái),配置相應(yīng)的訪問(wèn)策略,也可以實(shí)現(xiàn)客戶(hù)端安全操作數(shù)據(jù)庫(kù)。
詳情請(qǐng)查看云數(shù)據(jù)庫(kù)的文檔。

云存儲(chǔ)
laf 云存儲(chǔ)是基礎(chǔ) MinIO 提供的對(duì)象存儲(chǔ)服務(wù),laf 提供了完全兼容 MinIO (aws s3-api) 的對(duì)象存儲(chǔ)服務(wù), 在 laf oss 文檔上線之前,開(kāi)發(fā)者完全可參考 MinIO 的文檔來(lái)使用 laf oss。

靜態(tài)托管
laf 支持靜態(tài)網(wǎng)站的托管,可以快速的上線靜態(tài)網(wǎng)站,無(wú)需折騰 Nginx。
????? 誰(shuí)適合使用 Laf ?
前端開(kāi)發(fā)者 + laf= 全棧開(kāi)發(fā)者,前端秒變?nèi)珬?,成為真正的大前端?/section>laf為前端提供了 laf-client-sdk,適用于任何 js 運(yùn)行環(huán)境;laf云函數(shù)使用 js/ts 開(kāi)發(fā),前后端代碼無(wú)隔裂,無(wú)門(mén)檻快速上手;laf提供了靜態(tài)網(wǎng)站托管,可將前端構(gòu)建的網(wǎng)頁(yè)直接同步部署上來(lái),無(wú)需再配置服務(wù)器、Nginx、域名等;laf后續(xù)會(huì)提供多種客戶(hù)端的 SDK(Flutter/Android/iOS 等),為所有客戶(hù)端開(kāi)發(fā)者提供后端開(kāi)發(fā)服務(wù)和一致的開(kāi)發(fā)體驗(yàn)。后端開(kāi)發(fā)者,可以從瑣事中解放出來(lái),專(zhuān)注于業(yè)務(wù)本身,提升開(kāi)發(fā)效率。 laf可以節(jié)約服務(wù)器運(yùn)維、多環(huán)境部署和管理精力;laf可以讓你告別配置、調(diào)試 Nginx;laf可以讓你告別「為每個(gè)項(xiàng)目手動(dòng)部署數(shù)據(jù)庫(kù)、安全顧慮等重復(fù)性工作」;laf可以讓你告別「修改一次、發(fā)布半天」的重復(fù)繁瑣的迭代體驗(yàn);laf可以讓你隨時(shí)隨地在 Web 上查看函數(shù)的運(yùn)行日志,不必再連接服務(wù)器,費(fèi)神費(fèi)眼翻找;laf可以讓你「像寫(xiě)博客一樣寫(xiě)一個(gè)函數(shù)」,招之即來(lái),揮之即去,隨手發(fā)布!云開(kāi)發(fā)用戶(hù),若你是微信云開(kāi)發(fā)用戶(hù),你不僅可以獲得更強(qiáng)大、快速的開(kāi)發(fā)體驗(yàn),還不被微信云開(kāi)發(fā)平臺(tái)鎖定。 你可以為客戶(hù)提供源碼交付,為客戶(hù)私有部署一套 laf+ 你的云開(kāi)發(fā)應(yīng)用,而使用閉源的云開(kāi)發(fā)服務(wù),無(wú)法交付可獨(dú)立運(yùn)行的源碼;你可以根據(jù)未來(lái)的需要,隨時(shí)將自己的產(chǎn)品部署到自己的服務(wù)器上, laf是開(kāi)源免費(fèi)的;你甚至可以修改、訂制自己的云開(kāi)發(fā)平臺(tái), laf是開(kāi)源的、高度可擴(kuò)展的。Node.js 開(kāi)發(fā)者, laf是使用 Node.js 開(kāi)發(fā)的,你可以把laf當(dāng)成一個(gè)更方便的 Node.js 開(kāi)發(fā)平臺(tái) or 框架。你可以在線編寫(xiě)、調(diào)試函數(shù),不用重啟服務(wù),一鍵發(fā)布即可用; 你可以在線查看、檢索函數(shù)調(diào)用日志; 你可以不必折騰數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)、Nginx,隨時(shí)隨地讓你的應(yīng)用上線; 你可以隨手將一段 Node.js 代碼上云,比如一段爬蟲(chóng),一段監(jiān)控代碼,像寫(xiě)博客一樣寫(xiě) Node! 獨(dú)立開(kāi)發(fā)者、初創(chuàng)創(chuàng)業(yè)團(tuán)隊(duì), 節(jié)約成本,快速開(kāi)始,專(zhuān)注業(yè)務(wù)。 減少啟動(dòng)項(xiàng)目開(kāi)發(fā)的流程,快速啟動(dòng),縮短產(chǎn)品驗(yàn)證周期; 極大程度提高迭代速度,隨時(shí)應(yīng)對(duì)變化,隨時(shí)發(fā)布; 專(zhuān)注于產(chǎn)品業(yè)務(wù)本身,快速推出最小可用產(chǎn)品 (MVP),快速進(jìn)行產(chǎn)品、市場(chǎng)驗(yàn)證; 一個(gè)人 + laf= 團(tuán)隊(duì)。
?? Laf 能用來(lái)做什么?
laf是應(yīng)用的后端開(kāi)發(fā)平臺(tái),理論上可以做任何應(yīng)用!
使用 laf 快速開(kāi)發(fā)微信小程序 / 公眾號(hào):電商、社交、工具、教育、金融、游戲、短視頻、社區(qū)、企業(yè)等應(yīng)用! 微信小程序強(qiáng)要求 https 訪問(wèn),可直接使用 [lafyun.com];(http://www.lafyun.com “l(fā)afyun.com”) 創(chuàng)建應(yīng)用,為小程序提供 https 的接口服務(wù); 可將應(yīng)用的 h5 頁(yè)面和管理端 (admin) 直接部署到可由 laf靜態(tài)托管;將 h5 直接托管到 laf上,將分配的專(zhuān)用域名配置到公眾號(hào)即可在線訪問(wèn);使用云函數(shù)實(shí)現(xiàn)微信授權(quán)、支付等業(yè)務(wù); 使用云存儲(chǔ)存儲(chǔ)視頻、頭像等用戶(hù)數(shù)據(jù)。 開(kāi)發(fā) Android or iOS 應(yīng)用。 使用云函數(shù)、云數(shù)據(jù)庫(kù)、云存儲(chǔ)進(jìn)行業(yè)務(wù)處理; 應(yīng)用的后端管理 (admin) 直接部署到可由 laf靜態(tài)托管;可使用云函數(shù)實(shí)現(xiàn)微信授權(quán)、支付、熱更新等業(yè)務(wù)。 部署個(gè)人博客、企業(yè)官網(wǎng)。 將 vuepress / hexo / hugo 等靜態(tài)生成的博客,一鍵部署到 laf靜態(tài)托管上, 見(jiàn) laf-cli可使用云函數(shù)來(lái)處理用戶(hù)留言、評(píng)論、訪問(wèn)統(tǒng)計(jì)等業(yè)務(wù) 可使用云函數(shù)擴(kuò)展博客的其它能力,如課程、投票、提問(wèn)等 可使用云存儲(chǔ)存儲(chǔ)視頻、圖片 可使用云函數(shù)做爬蟲(chóng)、推送等功能 企業(yè)信息化建設(shè):企業(yè)私有部署一套 laf云開(kāi)發(fā)平臺(tái)快速開(kāi)發(fā)企業(yè)內(nèi)部信息化系統(tǒng),可快速上線、修改、迭代,降成本 支持多應(yīng)用、多賬戶(hù),不同部門(mén)、不同系統(tǒng),即可隔離,亦可連通 可借助 laf社區(qū)生態(tài),直接使用現(xiàn)存的laf應(yīng)用,開(kāi)箱即用,降成本laf開(kāi)源免費(fèi),沒(méi)有技術(shù)鎖定的顧慮,可自由訂制和使用個(gè)人開(kāi)發(fā)者的「手邊云」 laf讓開(kāi)發(fā)者隨手寫(xiě)的一段代碼,瞬間具備隨手上云的能力就像在你手機(jī)的備忘錄隨手敲下一段文字,自動(dòng)同步到云端,且可被全網(wǎng)訪問(wèn)和執(zhí)行 laf是每個(gè)開(kāi)發(fā)者的“爛筆頭”,像記事一樣寫(xiě)個(gè)函數(shù)laf是每個(gè)開(kāi)發(fā)者的“私人助理”,比如隨時(shí)可以寫(xiě)一個(gè)定時(shí)發(fā)送短信、郵件通知的函數(shù)其它 有用戶(hù)把 laf云存儲(chǔ)當(dāng)網(wǎng)盤(pán)使用有用戶(hù)把 laf應(yīng)用當(dāng)成一個(gè)日志服務(wù)器,收集客戶(hù)端日志數(shù)據(jù),使用云函數(shù)做分析統(tǒng)計(jì)有用戶(hù)用 laf來(lái)跑爬蟲(chóng),抓取三方新聞和咨訊等內(nèi)容有用戶(hù)使用 laf云函數(shù)做 webhook,監(jiān)聽(tīng) Git 倉(cāng)庫(kù)提交消息,推送到釘釘、企業(yè)微信群有用戶(hù)使用 laf云函數(shù)做撥測(cè),定時(shí)檢查線上服務(wù)的健康狀態(tài)…
未來(lái),
lafyun.com會(huì)上線一個(gè)應(yīng)用市場(chǎng),匯總收集這些應(yīng)用,讓laf用戶(hù)一鍵即可使用海量應(yīng)用 !
?? 如何快速開(kāi)始?
下面我們將在 lafyun.com 上,通過(guò)開(kāi)發(fā)一個(gè)簡(jiǎn)單的「用戶(hù)登錄/注冊(cè)」的功能,快速體驗(yàn) laf 云開(kāi)發(fā)。
準(zhǔn)備工作
你需要在 lafyun.com 上注冊(cè)一個(gè)賬戶(hù); 登錄到 lafyun.com 控制臺(tái) ,點(diǎn)擊左上角的 新建按鈕,創(chuàng)建一個(gè)空應(yīng)用;待應(yīng)用成功啟動(dòng)后,點(diǎn)擊右側(cè) 「開(kāi)發(fā)」 按鈕,進(jìn)入應(yīng)用的「開(kāi)發(fā)控制臺(tái)」,接下來(lái),我們將在「開(kāi)發(fā)控制臺(tái)」 進(jìn)行第一個(gè) laf應(yīng)用的功能開(kāi)發(fā)。
編寫(xiě)云函數(shù)
本示例會(huì)編寫(xiě)兩個(gè)云函數(shù):register 處理注冊(cè)請(qǐng)求,login 處理登錄請(qǐng)求。
用戶(hù)注冊(cè)云函數(shù)
在「云函數(shù)」管理頁(yè)面,點(diǎn)擊 「新建函數(shù)」,創(chuàng)建注冊(cè)云函數(shù) register。然后點(diǎn)擊 register 函數(shù)右側(cè)的 「開(kāi)發(fā)」按鈕,進(jìn)入 WebIDE,編寫(xiě)以下代碼:
import?cloud?from?'@/cloud-sdk'
import?{?createHash?}?from?'crypto'
exports.main?=?async?function?(ctx:?FunctionContext)?{
??const?username?=?ctx.body?.username?||?''
??const?password?=?ctx.body?.password?||?''
??//?check?param
??if?(!/[a-zA-Z0-9]{3,16}/.test(username))?return?{?error:?'invalid?username'?}
??if?(!/[a-zA-Z0-9]{3,16}/.test(password))??return?{?error:?'invalid?password'?}
??//?check?username?existed
??const?db?=?cloud.database()
??const?exists?=?await?db.collection('users')
????.where({?username:?username?})
????.count()
??if(exists.total?>?0)?return?{?error:?'username?already?existed'}
??//?add?user
??const?{?id?}?=?await?db.collection('users')
????.add({
??????username:?username,
??????password:?createHash('sha256').update(password).digest('hex'),
??????created_at:?new?Date()
????})
??console.log('user?registered:?',?id)
??return?{?data:?id?}
}
點(diǎn)擊右上角的 「顯示調(diào)試面板」(Ctrl/Cmd + B) 即可調(diào)試運(yùn)行。

點(diǎn)擊 「保存」 & 「發(fā)布」 函數(shù)即發(fā)布上線!
用戶(hù)登錄云函數(shù)
同上,創(chuàng)建 login 云函數(shù),編寫(xiě)以下代碼:
import?cloud?from?'@/cloud-sdk'
import?{?createHash?}?from?'crypto'
exports.main?=?async?function?(ctx:?FunctionContext)?{
??const?username?=?ctx.body?.username?||?''
??const?password?=?ctx.body?.password?||?''
??//?check?user?login
??const?db?=?cloud.database()
??const?res?=?await?db.collection('users')
????.where({
??????username:?username,
??????password:?createHash('sha256').update(password).digest('hex')
????})
????.getOne()
??if?(!res.data)
????return?{?error:?'invalid?username?or?password'?}
??
??//?generate?jwt?token
??const?user_id?=?res.data._id
??const?payload?=?{
????uid:?user_id,
????exp:?Math.floor(Date.now()?/?1000)?+?60?*?60?*?24?*?7
??}
??const?access_token?=?cloud.getToken(payload)
??return?{
????uid:?res.data._id,
????access_token:?access_token
??}
}
點(diǎn)擊右上角的 「顯示調(diào)試面板」(Ctrl/Cmd + B) 即可調(diào)試運(yùn)行。

點(diǎn)擊 「保存」 & 「發(fā)布」 函數(shù)即發(fā)布上線!
使用 curl 調(diào)用云函數(shù)
最后可以通過(guò)云函數(shù)列表頁(yè)面,查看 & 復(fù)制云函數(shù)的調(diào)用地址, 或?qū)⒁韵?curl 命令中的 APPID 替換成你的 APPID 后執(zhí)行:
#?注冊(cè)用戶(hù)
$?curl?-X?POST?-H?"Content-Type:?application/json"?-d?'{"username":?"admin",?"password":?"admin"}'?https://APPID.lafyun.com/register
#?用戶(hù)登陸
$?curl?-X?POST?-H?"Content-Type:?application/json"?-d?'{"username":?"admin",?"password":?"admin"}'?https://APPID.lafyun.com/login
APPID 可以在 lafyun.com 的歡迎頁(yè)面找到。

在前端項(xiàng)目中使用云函數(shù)
在你的前端項(xiàng)目中安裝 laf client sdk:
$?npm?install?laf-client-sdk
最后,可以在你的 Vue/React/Angular/小程序 頁(yè)面中調(diào)用這兩個(gè)云函數(shù)完成具體的登錄注冊(cè)功能!例如:
//?user.ts
import?{?Cloud?}?from?'laf-client-sdk'
const?cloud?=?new?Cloud({?
??baseUrl:?"https://APPID.lafyun.com",
??getAccessToken:?()?=>?localStorage.getItem('access_token')
})
//?regiser?function
export?async?function?register(username:?string,?password:?string)?{
??const?res?=?await?cloud.invoke('register',?{
????username:?username,
????password:?password
??})
??return?res
}
//?login?function
export?async?function?login(username:?string,?password:?string)?{
??const?res?=?await?cloud.invoke('login',?{
????username:?username,
????password:?password
??})
??if(res.access_token)?{
????//?save?token
????localStorage.setItem('access_token',?res.access_token)
??}
??return?res
}
注意事項(xiàng)
我們可以在開(kāi)發(fā)控制臺(tái),查看云函數(shù)的調(diào)用日志,在線調(diào)試等; 如果調(diào)用返回 404,請(qǐng)檢查函數(shù)名是否拼寫(xiě)錯(cuò)誤,或者云函數(shù)是否已經(jīng)發(fā)布。
?? 總結(jié)
運(yùn)維同學(xué)與后端同學(xué)請(qǐng)注意,由于 Laf 過(guò)于強(qiáng)悍,你們不再需要折騰基礎(chǔ)架構(gòu)和后端服務(wù),很可能會(huì)因?yàn)楣ぷ髁坎伙柡投媾R被裁的風(fēng)險(xiǎn)!注意控制風(fēng)險(xiǎn)!
Laf 開(kāi)源地址??:https://github.com/labring/laf
