国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用 CirruScript 渲染 HTML

BigNerdCoding / 1426人閱讀

摘要:早的時候我嘗試過用語法直接生成后邊也嘗試過用語法生成的模板效果勉勉強強主要是學習的作用后來有了就干脆不用了不過未來加載靜態資源還是需要有就覺得麻煩搞出點東西來這個模塊經過幾次演變最終定型成為很相似的寫法代碼是用低版本的寫的也能在里調用

早的時候我嘗試過用 Cirru 語法直接生成 HTML
后邊也嘗試過用 Cirru 語法生成 JavaScript 的模板
效果勉勉強強, 主要是學習的作用, 后來有了 React 就干脆不用了
不過未來加載靜態資源, 還是需要有 HTML, 就覺得麻煩, 搞出點東西來

stir-template

這個模塊經過幾次演變, 最終定型成為 React 很相似的寫法
https://github.com/mvc-works/stir-template
代碼是用低版本的 CirruScript 寫的, API 也能在 CoffeeScript 里調用

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, 渲染函數的第一個參數是屬性, 后邊是子元素
也提供了相似的輔助函數 render, createElement, createFactory
這樣寫出來的風格, 跟 CoffeeScript 里寫 React 組件也就差不多了
自己需要生成個標簽的話, 可以嘗試這樣的語法:

newTag = stir.createFactory "new-tag"

另外 算是個特殊的標簽, React 當中不提供
那么 stir-template 就方便配合 React 用在后者不方便的地方

Cirru 的縮進

http://script.cirru.org/

我的個人項目目前已經大量使用 CirruScript.. 算是刷排名吧
https://github.com/mvc-works/webpack-workflow
CirruScript 首先是編譯到 ES5 的代碼生成器, 其次才當做模板語言用
我覺得 CoffeeScript 里逗號太多, 縮進有 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 的結構大概還是能看到的, 接著就是語法了...

縮進

Cirru 首先不是靠很多語法發揮作用的語言, 而是靠的縮進
整個代碼會先被解析成一棵樹, 這棵樹才是后邊執行的重點
至少我在寫代碼的時候, 時時刻刻腦補他的樹是怎樣的, 可以看 Demo:
http://repo.cirru.org/parser/

美元符號 $

美元符號是為了解決一類縮進而引入的, 比如說下邊這樣的代碼:

(set a (f1 (f2 (f3 x))))

縮進以后想想都覺得很累, 會是這樣的, 還不如用括號

set a
  f1
    f2
      f3 x

那么我引入 $ 之后問題就輕松了, 直接就可以這樣寫:

set a $ f1 $ f2 $ f3 x

逗號 ,

然后逗號也是為了解決一類情況引入的, 意思大概和 $ 相反, 這樣的代碼

(set a (f1 a) (b) (f2))

改成縮進的時候會是這樣的, 注意單行的 bf2 因為換行是有括號的:

set a
  f1 a
  b
  f2

那么問題就來了, 有這樣的代碼怎么表示, 這里的 b 沒有括號了啊:

(set a (f1 a) b (f2))

所以我引入了 ,, 作用就是去掉一層縮進, 大概就是這樣:

(set a (f1 a) (, b) (f2))

然后再用縮進的寫法, 就不會解析出錯了:

set a
  f1 a
  , b
  f2

根據上邊 3 條規則, Cirru 語法的縮進能表示絕大部分編程需求
除了表達式第一個操作符里狂用括號的... 放哪個語言里都沒正常的辦法

CirruScript 的操作符

CirruScript 的編譯器是通過識別表達式第一個操作符來轉換 AST 的
比如說 var return 會被識別成對應的表達式或者語句的 AST
另外的 div 這樣的, 沒有對應的操作符, 就會被處理為函數調用

object 操作符, 用來生成對象, 它的參數都是鍵值對
它有個 alias 是{}, 我覺得看起來更習慣一些, 畢竟花括號還是很眼熟的
array 操作符同樣的意思, 用來生成數組, 它的參數就是元素了
它有個 alias 是 []. 空數組可能會寫成 ([]) 表示為表達式了

字面量還有標識符我做了一些處理, 方便寫代碼用
這里邊的 null true 都是回自動識別的, 數字也做了處理
另外 data.main 這種, 也通過成員表達式的 AST 進行了處理

這里邊還有些挺奇怪的比如說 {}~, 其實是 object~
但是但是, 這種正確的名稱應該是: **解構賦值**, 只是奇怪了點
奇怪的語法還是到 http://script.cirru.org 看吧, 可以看具體 AST 是什么

CirruScript 的字符串

字符串是個奇怪的事情, 因為 Cirru 是從圖形編輯器退化而來的..
退化嘛... 自然有的東西, 原來圖形很正常, 用文本表示就怪怪怪怪了的
Cirru 的語法里 a"a", 帶不帶引號, 實際上是一樣的
不一樣的是 "a1 a2"a1 a2, 沒有引號就是兩個節點, 有就是一個
所以... 引號實際上是為了特殊字符的轉義用的, 還有這種呢 "a1" a2"
你在