摘要:早的時(shí)候我嘗試過(guò)用語(yǔ)法直接生成后邊也嘗試過(guò)用語(yǔ)法生成的模板效果勉勉強(qiáng)強(qiáng)主要是學(xué)習(xí)的作用后來(lái)有了就干脆不用了不過(guò)未來(lái)加載靜態(tài)資源還是需要有就覺得麻煩搞出點(diǎn)東西來(lái)這個(gè)模塊經(jīng)過(guò)幾次演變最終定型成為很相似的寫法代碼是用低版本的寫的也能在里調(diào)用
早的時(shí)候我嘗試過(guò)用 Cirru 語(yǔ)法直接生成 HTML
后邊也嘗試過(guò)用 Cirru 語(yǔ)法生成 JavaScript 的模板
效果勉勉強(qiáng)強(qiáng), 主要是學(xué)習(xí)的作用, 后來(lái)有了 React 就干脆不用了
不過(guò)未來(lái)加載靜態(tài)資源, 還是需要有 HTML, 就覺得麻煩, 搞出點(diǎn)東西來(lái)
這個(gè)模塊經(jīng)過(guò)幾次演變, 最終定型成為 React 很相似的寫法
https://github.com/mvc-works/stir-template
代碼是用低版本的 CirruScript 寫的, API 也能在 CoffeeScript 里調(diào)用
stir = require :stir-tempate html = stir.html head = stir.head body = stir.body div = stir.createFactory :div renderPage = (data) -> stir.render stir.doctype() html null, head null, body null, div name: "a", "empty" div()
可以看到模仿了 React, 渲染函數(shù)的第一個(gè)參數(shù)是屬性, 后邊是子元素
也提供了相似的輔助函數(shù) render, createElement, createFactory
這樣寫出來(lái)的風(fēng)格, 跟 CoffeeScript 里寫 React 組件也就差不多了
自己需要生成個(gè)標(biāo)簽的話, 可以嘗試這樣的語(yǔ)法:
newTag = stir.createFactory "new-tag"
另外 算是個(gè)特殊的標(biāo)簽, React 當(dāng)中不提供
那么 stir-template 就方便配合 React 用在后者不方便的地方
http://script.cirru.org/
我的個(gè)人項(xiàng)目目前已經(jīng)大量使用 CirruScript.. 算是刷排名吧
https://github.com/mvc-works/webpack-workflow
CirruScript 首先是編譯到 ES5 的代碼生成器, 其次才當(dāng)做模板語(yǔ)言用
我覺得 CoffeeScript 里逗號(hào)太多, 縮進(jìn)有 bug, 不開心一直用
CirruScript 配合 stir-template 跟 React 可以這樣用:
var stir $ require :stir-template React $ require :react var Page $ React.createFactory $ require :./src/page var ({}~ html head title body meta script link div a span) stir var line $ (text) (div ({} (:className :line)) text) = module.exports $ (data) return $ stir.render stir.doctype html null head null title null ":Coffee Webpack Starter" meta $ object (:charset :utf-8) link $ object (:rel :icon) :href :http://tp4.sinaimg.cn/5592259015/180/5725970590/1 link $ {} (:rel :stylesheet) :href $ cond data.dev :src/main.css data.style script $ object (:src data.vendor) (:defer true) script $ object (:src data.main) (:defer true) body null div ({} (:class :intro)) div ({} (:class :title)) ":This is a demo of Webpack usage." line ":Open Console to see how it loads." div null span null ":Read more at " a {} (:href :http://github.com/teambition/coffee-webpack-starter) , :github.com/teambition/coffee-webpack-starter span null :. div ({} (:class :demo)) React.renderToString (Page)
首先 HTML 的結(jié)構(gòu)大概還是能看到的, 接著就是語(yǔ)法了...
縮進(jìn)
Cirru 首先不是靠很多語(yǔ)法發(fā)揮作用的語(yǔ)言, 而是靠的縮進(jìn)
整個(gè)代碼會(huì)先被解析成一棵樹, 這棵樹才是后邊執(zhí)行的重點(diǎn)
至少我在寫代碼的時(shí)候, 時(shí)時(shí)刻刻腦補(bǔ)他的樹是怎樣的, 可以看 Demo:
http://repo.cirru.org/parser/
美元符號(hào) $
美元符號(hào)是為了解決一類縮進(jìn)而引入的, 比如說(shuō)下邊這樣的代碼:
(set a (f1 (f2 (f3 x))))
縮進(jìn)以后想想都覺得很累, 會(huì)是這樣的, 還不如用括號(hào)
set a f1 f2 f3 x
那么我引入 $ 之后問(wèn)題就輕松了, 直接就可以這樣寫:
set a $ f1 $ f2 $ f3 x
逗號(hào) ,
然后逗號(hào)也是為了解決一類情況引入的, 意思大概和 $ 相反, 這樣的代碼
(set a (f1 a) (b) (f2))
改成縮進(jìn)的時(shí)候會(huì)是這樣的, 注意單行的 b 跟 f2 因?yàn)閾Q行是有括號(hào)的:
set a f1 a b f2
那么問(wèn)題就來(lái)了, 有這樣的代碼怎么表示, 這里的 b 沒(méi)有括號(hào)了啊:
(set a (f1 a) b (f2))
所以我引入了 ,, 作用就是去掉一層縮進(jìn), 大概就是這樣:
(set a (f1 a) (, b) (f2))
然后再用縮進(jìn)的寫法, 就不會(huì)解析出錯(cuò)了:
set a f1 a , b f2
根據(jù)上邊 3 條規(guī)則, Cirru 語(yǔ)法的縮進(jìn)能表示絕大部分編程需求
除了表達(dá)式第一個(gè)操作符里狂用括號(hào)的... 放哪個(gè)語(yǔ)言里都沒(méi)正常的辦法
CirruScript 的編譯器是通過(guò)識(shí)別表達(dá)式第一個(gè)操作符來(lái)轉(zhuǎn)換 AST 的
比如說(shuō) var return 會(huì)被識(shí)別成對(duì)應(yīng)的表達(dá)式或者語(yǔ)句的 AST
另外的 div 這樣的, 沒(méi)有對(duì)應(yīng)的操作符, 就會(huì)被處理為函數(shù)調(diào)用
object 操作符, 用來(lái)生成對(duì)象, 它的參數(shù)都是鍵值對(duì)
它有個(gè) alias 是{}, 我覺得看起來(lái)更習(xí)慣一些, 畢竟花括號(hào)還是很眼熟的
array 操作符同樣的意思, 用來(lái)生成數(shù)組, 它的參數(shù)就是元素了
它有個(gè) alias 是 []. 空數(shù)組可能會(huì)寫成 ([]) 表示為表達(dá)式了
字面量還有標(biāo)識(shí)符我做了一些處理, 方便寫代碼用
這里邊的 null true 都是回自動(dòng)識(shí)別的, 數(shù)字也做了處理
另外 data.main 這種, 也通過(guò)成員表達(dá)式的 AST 進(jìn)行了處理
這里邊還有些挺奇怪的比如說(shuō) {}~, 其實(shí)是 object~
但是但是, 這種正確的名稱應(yīng)該是: **解構(gòu)賦值**, 只是奇怪了點(diǎn)
奇怪的語(yǔ)法還是到 http://script.cirru.org 看吧, 可以看具體 AST 是什么
字符串是個(gè)奇怪的事情, 因?yàn)?Cirru 是從圖形編輯器退化而來(lái)的..
退化嘛... 自然有的東西, 原來(lái)圖形很正常, 用文本表示就怪怪怪怪了的
Cirru 的語(yǔ)法里 a 和 "a", 帶不帶引號(hào), 實(shí)際上是一樣的
不一樣的是 "a1 a2" 和 a1 a2, 沒(méi)有引號(hào)就是兩個(gè)節(jié)點(diǎn), 有就是一個(gè)
所以... 引號(hào)實(shí)際上是為了特殊字符的轉(zhuǎn)義用的, 還有這種呢 "a1" a2"
你在 里打字的時(shí)候不用轉(zhuǎn)義, 圖形界面嘛, 那是正常的時(shí)候
然后為了表示字符串, 我動(dòng)起來(lái)歪腦筋, 對(duì), 用冒號(hào) :
冒號(hào)開頭的就是字符串了, 沒(méi)有特殊字符的時(shí)候還可以少一個(gè)字符
:utf-8 跟 ":utf-8" 表示的是一個(gè)意思, 編譯的結(jié)果也是一樣的
必須加引號(hào)的是 ":hello world" 這樣的有特殊字符的節(jié)點(diǎn)
看多了 Clojure 的話其實(shí)冒號(hào)你是會(huì)習(xí)慣的...
最新版的 Gulp 應(yīng)該是能識(shí)別 gulpfile.cirru 這樣的后綴的
我也寫了插件, 應(yīng)該問(wèn)題不大, CoffeeScript 這么難用都用下來(lái)了
https://github.com/Cirru/gulp-cirru-script
一般我會(huì)寫個(gè) template.cirru 文件, 從 Gulp 里引用
最后執(zhí)行一下函數(shù), 就能從數(shù)據(jù)渲染出 HTML 來(lái)了:
require("cirru-script/lib/register") gulp.task "html", (cb) -> html = require"./template.cirru" # <-- 引用看這里 fs = require "fs" if not env.dev assets = require "./build/assets.json" env.main = "./build/#{assets.main}" env.vendor = "./build/#{assets.vendor}" fs.writeFile "index.html", (html env), cb # <-- 調(diào)用看這里
希望你有興趣用 CirruScript 生成 HTML. 早日淘汰手寫 HTML.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/49615.html
摘要:早的時(shí)候我嘗試過(guò)用語(yǔ)法直接生成后邊也嘗試過(guò)用語(yǔ)法生成的模板效果勉勉強(qiáng)強(qiáng)主要是學(xué)習(xí)的作用后來(lái)有了就干脆不用了不過(guò)未來(lái)加載靜態(tài)資源還是需要有就覺得麻煩搞出點(diǎn)東西來(lái)這個(gè)模塊經(jīng)過(guò)幾次演變最終定型成為很相似的寫法代碼是用低版本的寫的也能在里調(diào)用 早的時(shí)候我嘗試過(guò)用 Cirru 語(yǔ)法直接生成 HTML后邊也嘗試過(guò)用 Cirru 語(yǔ)法生成 JavaScript 的模板效果勉勉強(qiáng)強(qiáng), 主要是學(xué)習(xí)的作用...
摘要:這是項(xiàng)目相關(guān)的代碼就是把代碼變換成代碼當(dāng)前版本的用的是手工轉(zhuǎn)化代碼是比較亂的雖然也比較有效其中支持導(dǎo)致代碼的復(fù)雜性難以降低而且實(shí)際上我當(dāng)前寫的幾個(gè)項(xiàng)目都是沒(méi)有開啟因?yàn)樘嵘⒉幻黠@另一個(gè)原因是代碼和幾乎是對(duì)應(yīng)的在對(duì)所有文件都打包的前提下查看源 這是 Cirru 項(xiàng)目相關(guān)的代碼, 就是把 Cirru 代碼變換成 JavaScript 代碼 當(dāng)前版本的 CirruScript 用的是手工轉(zhuǎn)化...
摘要:參與情況第一天趕上了時(shí)間晚上聚餐沒(méi)去第二天趕飛機(jī)提前退場(chǎng)關(guān)于的幾個(gè)分項(xiàng)沒(méi)有在場(chǎng)微信群幾乎全程參與并且大部分時(shí)間在維護(hù)氣氛陰差陽(yáng)錯(cuò)兩天都沒(méi)上錯(cuò)過(guò)了推廣機(jī)會(huì)公司展位準(zhǔn)備不充分連續(xù)兩年的問(wèn)題需要注意印象深的演講百度上的很贊而且在上對(duì)付鼠標(biāo)事件我很 參與情況 第一天趕上了時(shí)間, 晚上聚餐沒(méi)去 Nodebot 第二天趕飛機(jī)提前退場(chǎng), 關(guān)于 React 的幾個(gè)分項(xiàng)沒(méi)有在場(chǎng) 微信群幾乎全程參與, ...
摘要:細(xì)說(shuō)后端模板渲染客戶端渲染中間層服務(wù)器端渲染前端與后端渲染方式的發(fā)展大致經(jīng)歷了這樣幾個(gè)階段后端模板渲染客戶端渲染中間層服務(wù)器端渲染。與后端模板渲染剛好相反,客戶端渲染的頁(yè)面渲染都是在客戶端進(jìn)行,后端不負(fù)責(zé)任何的渲染,只管數(shù)據(jù)交互。 細(xì)說(shuō)后端模板渲染、客戶端渲染、node 中間層、服務(wù)器端渲染(ssr) 前端與后端渲染方式的發(fā)展大致經(jīng)歷了這樣幾個(gè)階段:后端模板渲染、客戶端渲染、node ...
閱讀 2083·2023-04-25 17:57
閱讀 1288·2021-11-24 09:39
閱讀 2487·2019-08-29 16:39
閱讀 3317·2019-08-29 13:44
閱讀 3127·2019-08-29 13:14
閱讀 2323·2019-08-26 11:36
閱讀 3816·2019-08-26 11:00
閱讀 952·2019-08-26 10:14