各位雲原生搬磚師 and PPT 架構師,你們有沒有想過像寫文章一樣方便地寫代碼呢?
怎樣才能像寫文章一樣寫代碼? 理想的需求應該是可以在線編寫、調試函數,不用重啓服務,隨時隨地在 Web 上查看函數的運行日誌,無需連接服務器,無需折騰數據庫、對象存儲、Nginx 等,可以隨時隨地上線應用,招之即來,揮之即去,隨手發佈!
這時候懂王上線了,好傢伙,這不就是 Serverless 嘛,Serverless 的願景是用戶只需專注開發意圖,編寫函數代碼,並上傳到代碼倉庫,其他的東西不需要關心,Serverless 平臺會自動分配計算資源,並按需運行函數。
你懂的真多,可惜啊,僅有 Serverless 還滿足不了上述需求。
要想像寫文章一樣寫代碼,除了需要 Serverless 來提供函數計算服務之外,還需要以下幾個必備條件:
- 雲數據庫:爲應用開發提供開箱即用的數據庫服務;
- 雲存儲:爲應用開發提供專業的文件對象存儲服務,兼容 S3 和其他存儲服務接口;
- WebIDE:在線寫代碼,完善的類型提示、代碼自動完成,隨手發佈上線!
懂王又上線了,這個我也懂,騰訊雲開發、Google Firebase 以及 UniCloud 就提供這樣的功能。
如果我告訴你現在有一個平臺已經俱備了上述的所有條件,而且完全開源,每個開發團隊都可以隨時擁有一個自己的雲開發平臺,你會不會內心狂喜?
是的,這個平臺就是 Laf。
人生苦短,前端用 Laf,後端用 Laf,雲開發用戶用 Laf,獨立開發者用 Laf,初創團隊用 Laf,我也用 Laf。上鍊接🔗:
值得一提的是,Laf 在上週五一天內 Star 數量增長了近 300 個,並且後續連續幾天的 Star 數量呈垂直上升,簡直就是簡直了。
👀 Laf 是什麼?
Laf 本質上是一個集「函數計算」、「數據庫」、「對象存儲」等於一身的一站式開發平臺,可以快速的開發併發布應用。它包含了以下幾個功能:
雲函數
雲函數是運行在雲端的 JavaScript 代碼,熟悉 Node.js 的開發者可以直接上手。
雲函數也可以使用 Typescript 編寫,無需管理服務器,在開發控制檯在線編寫、在線調試、一鍵保存即可運行後端代碼。
在你的應用中,大多數數據的獲取都可在客戶端直接操作數據庫,但是通常業務中會使用到「非數據庫操作」,如註冊、登錄、文件操作、事務、第三方接口等,可直接使用雲函數實現。
詳情請查看雲函數的文檔。
雲數據庫
前端可使用 laf-client-sdk “直連”雲數據庫,無需與服務端對接口。
通過在開發控制檯,配置相應的訪問策略,也可以實現客戶端安全操作數據庫。
詳情請查看雲數據庫的文檔。
雲存儲
laf 雲存儲是基礎 MinIO 提供的對象存儲服務,laf 提供了完全兼容 MinIO (aws s3-api) 的對象存儲服務, 在 laf oss 文檔上線之前,開發者完全可參考 MinIO 的文檔來使用 laf oss。
靜態託管
laf 支持靜態網站的託管,可以快速的上線靜態網站,無需折騰 Nginx。
👨💻 誰適合使用 Laf ?
-
前端開發者 +
laf
= 全棧開發者,前端秒變全棧,成爲真正的大前端。laf
爲前端提供了 laf-client-sdk,適用於任何 js 運行環境;laf
雲函數使用 js/ts 開發,前後端代碼無隔裂,無門檻快速上手;laf
提供了靜態網站託管,可將前端構建的網頁直接同步部署上來,無需再配置服務器、Nginx、域名等;laf
後續會提供多種客戶端的 SDK(Flutter/Android/iOS 等),爲所有客戶端開發者提供後端開發服務和一致的開發體驗。
-
後端開發者,可以從瑣事中解放出來,專注於業務本身,提升開發效率。
laf
可以節約服務器運維、多環境部署和管理精力;laf
可以讓你告別配置、調試 Nginx;laf
可以讓你告別「爲每個項目手動部署數據庫、安全顧慮等重複性工作」;laf
可以讓你告別「修改一次、發佈半天」的重複繁瑣的迭代體驗;laf
可以讓你隨時隨地在 Web 上查看函數的運行日誌,不必再連接服務器,費神費眼翻找;laf
可以讓你「像寫博客一樣寫一個函數」,招之即來,揮之即去,隨手發佈!
-
雲開發用戶,若你是微信雲開發用戶,你不僅可以獲得更強大、快速的開發體驗,還不被微信雲開發平臺鎖定。
- 你可以爲客戶提供源碼交付,爲客戶私有部署一套
laf
+ 你的雲開發應用,而使用閉源的雲開發服務,無法交付可獨立運行的源碼; - 你可以根據未來的需要,隨時將自己的產品部署到自己的服務器上,
laf
是開源免費的; - 你甚至可以修改、訂製自己的雲開發平臺,
laf
是開源的、高度可擴展的。
- 你可以爲客戶提供源碼交付,爲客戶私有部署一套
-
Node.js 開發者,
laf
是使用 Node.js 開發的,你可以把laf
當成一個更方便的 Node.js 開發平臺 or 框架。- 你可以在線編寫、調試函數,不用重啓服務,一鍵發佈即可用;
- 你可以在線查看、檢索函數調用日誌;
- 你可以不必折騰數據庫、對象存儲、Nginx,隨時隨地讓你的應用上線;
- 你可以隨手將一段 Node.js 代碼上雲,比如一段爬蟲,一段監控代碼,像寫博客一樣寫 Node!
-
獨立開發者、初創創業團隊, 節約成本,快速開始,專注業務。
- 減少啓動項目開發的流程,快速啓動,縮短產品驗證週期;
- 極大程度提高迭代速度,隨時應對變化,隨時發佈;
- 專注於產品業務本身,快速推出最小可用產品 (MVP),快速進行產品、市場驗證;
- 一個人 +
laf
= 團隊。
💥 Laf 能用來做什麼?
laf
是應用的後端開發平臺,理論上可以做任何應用!
-
使用 laf 快速開發微信小程序 / 公衆號: 電商、社交、工具、教育、金融、遊戲、短視頻、社區、企業等應用!
- 微信小程序強要求 https 訪問,可直接使用 [lafyun.com];(http://www.lafyun.com "lafyun.com") 創建應用,爲小程序提供 https 的接口服務;
- 可將應用的 h5 頁面和管理端 (admin) 直接部署到可由
laf
靜態託管; - 將 h5 直接託管到
laf
上,將分配的專用域名配置到公衆號即可在線訪問; - 使用雲函數實現微信授權、支付等業務;
- 使用雲存儲存儲視頻、頭像等用戶數據。
-
開發 Android or iOS 應用。
- 使用雲函數、雲數據庫、雲存儲進行業務處理;
- 應用的後端管理 (admin) 直接部署到可由
laf
靜態託管; - 可使用雲函數實現微信授權、支付、熱更新等業務。
-
部署個人博客、企業官網。
- 將 vuepress / hexo / hugo 等靜態生成的博客,一鍵部署到
laf
靜態託管上, 見 laf-cli - 可使用雲函數來處理用戶留言、評論、訪問統計等業務
- 可使用雲函數擴展博客的其它能力,如課程、投票、提問等
- 可使用雲存儲存儲視頻、圖片
- 可使用雲函數做爬蟲、推送等功能
- 將 vuepress / hexo / hugo 等靜態生成的博客,一鍵部署到
-
企業信息化建設:企業私有部署一套
laf
雲開發平臺- 快速開發企業內部信息化系統,可快速上線、修改、迭代,降成本
- 支持多應用、多賬戶,不同部門、不同系統,即可隔離,亦可連通
- 可藉助
laf
社區生態,直接使用現存的laf
應用,開箱即用,降成本 laf
開源免費,沒有技術鎖定的顧慮,可自由訂製和使用
-
個人開發者的「手邊雲」
laf
讓開發者隨手寫的一段代碼,瞬間具備隨手上雲的能力- 就像在你手機的備忘錄隨手敲下一段文字,自動同步到雲端,且可被全網訪問和執行
laf
是每個開發者的“爛筆頭”,像記事一樣寫個函數laf
是每個開發者的“私人助理”,比如隨時可以寫一個定時發送短信、郵件通知的函數
-
其它
- 有用戶把
laf
雲存儲當網盤使用 - 有用戶把
laf
應用當成一個日誌服務器,收集客戶端日誌數據,使用雲函數做分析統計 - 有用戶用
laf
來跑爬蟲,抓取三方新聞和諮訊等內容 - 有用戶使用
laf
雲函數做 webhook,監聽 Git 倉庫提交消息,推送到釘釘、企業微信羣 - 有用戶使用
laf
雲函數做撥測,定時檢查線上服務的健康狀態 - ...
- 有用戶把
未來,
lafyun.com
會上線一個應用市場,彙總收集這些應用,讓laf
用戶一鍵即可使用海量應用 !
🚀 如何快速開始?
下面我們將在 lafyun.com 上,通過開發一個簡單的「用戶登錄/註冊」的功能,快速體驗 laf
雲開發。
準備工作
- 你需要在 lafyun.com 上註冊一個賬戶;
- 登錄到 lafyun.com 控制檯 ,點擊左上角的
新建
按鈕,創建一個空應用; - 待應用成功啓動後,點擊右側 「開發」 按鈕,進入應用的「開發控制檯」,接下來,我們將在「開發控制檯」 進行第一個
laf
應用的功能開發。
編寫雲函數
本示例會編寫兩個雲函數:register
處理註冊請求,login
處理登錄請求。
用戶註冊雲函數
在「雲函數」管理頁面,點擊 「新建函數」,創建註冊雲函數 register
。然後點擊 register
函數右側的 「開發」按鈕,進入 WebIDE,編寫以下代碼:
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 }
}
點擊右上角的 「顯示調試面板」(Ctrl/Cmd + B) 即可調試運行。
點擊 「保存」 & 「發佈」 函數即發佈上線!
用戶登錄雲函數
同上,創建 login
雲函數,編寫以下代碼:
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
}
}
點擊右上角的 「顯示調試面板」(Ctrl/Cmd + B) 即可調試運行。
點擊 「保存」 & 「發佈」 函數即發佈上線!
使用 curl 調用雲函數
最後可以通過雲函數列表頁面,查看 & 複製雲函數的調用地址, 或將以下 curl 命令中的 APPID
替換成你的 APPID 後執行:
# 註冊用戶
$ curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "admin"}' https://APPID.lafyun.com/register
# 用戶登陸
$ curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "admin"}' https://APPID.lafyun.com/login
APPID 可以在 lafyun.com 的歡迎頁面找到。
在前端項目中使用雲函數
在你的前端項目中安裝 laf client sdk:
$ npm install laf-client-sdk
最後,可以在你的 Vue/React/Angular/小程序 頁面中調用這兩個雲函數完成具體的登錄註冊功能!例如:
// 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
}
注意事項
- 我們可以在開發控制檯,查看雲函數的調用日誌,在線調試等;
- 如果調用返回 404,請檢查函數名是否拼寫錯誤,或者雲函數是否已經發布。
📝 總結
運維同學與後端同學請注意,由於 Laf 過於強悍,你們不再需要折騰基礎架構和後端服務,很可能會因爲工作量不飽和而面臨被裁的風險!注意控制風險!