零配置 web 框架——Zero Server

有過(guò) web 開發(fā)經(jīng)歷的小伙伴大概對(duì)配置文件是深惡痛絕的——實(shí)在是太多了,最常見(jiàn)的就有 babel、eslint、tsconfig瘟芝、webpack,package.json 等等润歉;而且各種配置使用不同的文件擴(kuò)展,使用時(shí)還要安裝各種插件颈抚,繁瑣且無(wú)聊踩衩。幾年前,主流框架開始嘗試提供無(wú)腦啟動(dòng)的腳手架贩汉,如create-react-app驱富、vue create等等,其中有些小眾框架甚至主打了零配置招牌匹舞。這期就介紹一款完全零配置的 Web 框架——zero server褐鸥。

概述

所謂零配置,就是不需要手寫任何配置文件赐稽,只要把代碼放在工作空間叫榕,直接一行命令浑侥,安裝、編譯晰绎、打包寓落、啟動(dòng)等等全套服務(wù)一氣呵成。Zero Server 就是基于這種愿景設(shè)計(jì)的一款 web 框架荞下,它的主要特色有:

  • 零依賴配置管理
  • 基于文件路徑的 API 路由
  • 支持動(dòng)態(tài)路由
  • 支持服務(wù)端渲染(SSR)和靜態(tài)頁(yè)面生成(SSG)
  • 支持主流的框架和語(yǔ)言伶选,包括 React、Vue尖昏、Node仰税、Python、Markdown 等等

Get Started

OK抽诉,略過(guò)似懂非懂的概述陨簇,我們先回到一切的開始——安裝。使用該框架前掸鹅,需要全局安裝 zero:

npm i -g zero

安裝結(jié)束后塞帐,為 Zero 應(yīng)用創(chuàng)建一個(gè)根目錄:

mkdir zero-app

接著在 zero-app 目錄下新建一個(gè) index.jsx 文件:我們先以一個(gè)簡(jiǎn)單的 React 應(yīng)用為例,寫一個(gè) Hello World 的函數(shù)組件:

export default () => <h1>Hello World</h1>;
zero-app

運(yùn)行 zero

cd zero-app
zero

看效果如下巍沙,配置(.babelrc葵姥、.gitignore)和依賴相關(guān)的文件(package.json、node_module句携、yarn.lock)都自動(dòng)生成了:

run zero

順道榔幸,zero 還幫我們啟動(dòng)了服務(wù);瀏覽器輸入 localhost:3000矮嫉,便可看到 index.jsx 的實(shí)現(xiàn)了:

index

有了 React削咆,我們?cè)僭囋?Vue;在根目錄新建 about.vue 如下:

<template>
  <h2>{{ message }}</h2>
</template>
<script>
  module.exports = {
    data() {
      return {
        message: "About Vue",
      };
    },
  };
</script>

Zero 能識(shí)別所有主流框架的擴(kuò)展名蠢笋,并處理好相關(guān)依賴拨齐,最后熱啟動(dòng)服務(wù)——一條龍服務(wù)省心省力。我們轉(zhuǎn)到 localhost:3000/about 看一下效果:

about

有興趣的小伙伴還可以試試 markdown昨寞、python瞻惋、html 等等文件。

路由

從上文中大家不難發(fā)現(xiàn) zero 框架中文件和路由的關(guān)系大致如下:

file route
index.jsx localhost:3000
about.vue localhost:3000/about
markdown.md localhost:3000/markdown

Zero 應(yīng)用就是基于文件目錄的路由系統(tǒng):

  • 在開發(fā)環(huán)境下援岩,只要在特定目錄下新建相關(guān)文件歼狼,zero 會(huì)根據(jù)路勁+文件名(不包括擴(kuò)展名)自動(dòng)建立對(duì)應(yīng)路由(由于加載依賴,速度上有點(diǎn)慢)
  • 生成環(huán)境需要提前 build 一下(zero build)享怀,接著 zero 便會(huì)在 .zero 目錄下生成特定的靜態(tài)資源羽峰,并根據(jù)文件目錄建立路由表
route

API 路由

書接上文,zero 除了支持編譯靜態(tài)資源,還支持動(dòng)態(tài) API梅屉,默認(rèn)框架是 express.js值纱。我們新建 node 文件 /api/hello.js,并返回一個(gè) message 對(duì)象:

export default (req, res) => {
  res.send({ message: "Hello from API." });
};

API 依舊是基于路勁的路由履植,我們打開localhost:3000/api/hello计雌,可以看到返回的數(shù)據(jù):

API

接著再看一下如何調(diào)用這些 API。上文提到 Zero 支持服務(wù)端渲染(SSR)玫霎,我們還是以 React 為例看一下使用方法凿滤。Zero 原生支持了 React SSR 框架 next.js;它提供了一個(gè) getInitialProps 的方法獲取 API 數(shù)據(jù)庶近,并在服務(wù)端渲染后返回頁(yè)面資源翁脆。我們新建一個(gè) hello.jsx 文件使用后端渲染技術(shù):

import React from "react";

export default class extends React.Component {
  static async getInitialProps() {
    return fetch("/api/hello")
      .then((res) => res.json())
      .then((json) => ({ message: json.message }));
  }

  render() {
    return <p>Message from API: {this.props.message}</p>;
  }
}

看看服務(wù)端調(diào)用 API 的效果:

Hello From API

動(dòng)態(tài)路由

除此之外,Zero 還提供了動(dòng)態(tài)路由機(jī)制鼻种;當(dāng)然還是基于文件系統(tǒng)的路徑反番,只是動(dòng)態(tài)動(dòng)態(tài)路由表對(duì)應(yīng)的是 $ 符開頭的文件。舉個(gè)例子叉钥,新建一個(gè) react 頁(yè)面——/user/$name.jsx罢缸;再次利用 next.js 的getInitialProps 獲取 url 的參數(shù) name:

import React from "react";

export default class extends React.Component {
  static async getInitialProps({ url }) {
    const { params } = url;
    return { name: params.name };
  }

  render() {
    return <div>Your user name: {this.props.name}</div>;
  }
}

輸入 localhost:3000/user/Onion;這里 Onion 就是動(dòng)態(tài)填充的 $name投队,看效果:

User name

Vue枫疆、Svelte、Python 等等框架有它們自己的 SSR 方法敷鸦,有興趣的小伙伴可以在這里查看具體使用息楔。

小結(jié)

Zero 是一個(gè)比較有趣的 Web 框架,從案例來(lái)看幾乎實(shí)現(xiàn)了所有的零配置需求扒披。但是值依,現(xiàn)實(shí)中,我猜碟案,幾乎不會(huì)有技術(shù)負(fù)責(zé)人把它放到生產(chǎn)線上去愿险。零配置 Web 框架還是出生得太早了,生產(chǎn)環(huán)境中大概率就是一個(gè)無(wú)底黑洞价说。
不過(guò)辆亏,寫寫 demo,快速搭建一個(gè)本地服務(wù)熔任,Zero 還是一個(gè)很完美的選擇褒链。當(dāng)然唁情,也希望有朝一日疑苔,能真正出現(xiàn)一種優(yōu)雅的框架解決現(xiàn)階段繁瑣的配置;不過(guò)甸鸟,那時(shí)候可能前端開發(fā)人員也不值錢了吧惦费。哈哈兵迅,讓我們拭目以待吧。

文章同步發(fā)布于an-Onion 的 Github薪贫。碼字不易恍箭,歡迎點(diǎn)贊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞧省,一起剝皮案震驚了整個(gè)濱河市扯夭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鞍匾,老刑警劉巖交洗,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橡淑,居然都是意外死亡构拳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門梁棠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)置森,“玉大人,你說(shuō)我怎么就攤上這事符糊≠旌#” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵濒蒋,是天一觀的道長(zhǎng)盐碱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沪伙,這世上最難降的妖魔是什么瓮顽? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮围橡,結(jié)果婚禮上暖混,老公的妹妹穿的比我還像新娘。我一直安慰自己翁授,他們只是感情好拣播,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著收擦,像睡著了一般贮配。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞赂,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天泪勒,我揣著相機(jī)與錄音,去河邊找鬼。 笑死圆存,一個(gè)胖子當(dāng)著我的面吹牛叼旋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沦辙,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夫植,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了油讯?” 一聲冷哼從身側(cè)響起详民,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陌兑,沒(méi)想到半個(gè)月后阐斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诀紊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年谒出,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻奠。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笤喳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碌宴,到底是詐尸還是另有隱情杀狡,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布贰镣,位于F島的核電站呜象,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碑隆。R本人自食惡果不足惜恭陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望上煤。 院中可真熱鬧休玩,春花似錦、人聲如沸劫狠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)独泞。三九已至呐矾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懦砂,已是汗流浹背蜒犯。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工讲坎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愧薛。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衫画,于是被迫代替她去往敵國(guó)和親毫炉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容