Riot - 編譯器

瀏覽器內(nèi)編譯

1. 直觀體驗(yàn)

自定義標(biāo)簽需要編譯成 JavaScript 后才能在瀏覽器中運(yùn)行。你可以在script標(biāo)簽中設(shè)置type="riot/tag"屬性

<!-- 加載點(diǎn) -->
<my-tag></my-tag>

<!-- 在當(dāng)前頁面中內(nèi)置標(biāo)簽定義 -->
<script type="riot/tag">
  <my-tag>
    <h3>Tag layout</h3>
    <inner-tag />
  </my-tag>
</script>

<!-- <inner-tag/> 定義在外部文件中 -->
<script src="path/to/javascript/with-tags.js" type="riot/tag"></script>

<!-- 包含 riot.js 和編譯器 -->
<script src="https://cdn.jsdelivr.net/riot/2.3/riot+compiler.min.js"></script>

<!-- 正常加載 -->
<script>
riot.mount('*')
</script>

script 標(biāo)簽和外部文件可以包含多個(gè)標(biāo)簽定義,可以與普通 javascript 代碼混合在一起。
Riot 會自動提取內(nèi)置和外部標(biāo)簽定義,并在調(diào)用 riot.mount() 對標(biāo)簽進(jìn)行渲染之前對其進(jìn)行編譯。

2. 訪問標(biāo)簽實(shí)例

如果用 script src 加載標(biāo)簽而希望訪問加載后的標(biāo)簽實(shí)例,你需要象下面這樣將mount調(diào)用包在riot.compile中:

<script>
riot.compile(function() {
  // 這種寫法標(biāo)簽的編譯和加載(mount)操作是同步的
  var tags = riot.mount('*')
})
</script>

3. 編譯器性能

?編譯過程基本上不花什么時(shí)間。在一個(gè)普通的應(yīng)用中編譯一個(gè) timer標(biāo)簽 30次需要2毫秒。如果你的頁面上有1000個(gè)不同的象timer這樣大小的標(biāo)簽,編譯也只需要35毫秒。

?編譯器的大小只有 3.2KB (gzip壓縮后僅 1.7K) 所以在生產(chǎn)環(huán)境中進(jìn)行客戶端編譯不會有下載和性能方面的問題.


?

編譯方案 - 預(yù)編譯

1. 編譯方案

有兩種編譯方式

  • 瀏覽器內(nèi)編譯 - 對調(diào)試不友好,不建議使用
  • 預(yù)編譯

我們只介紹一下 “預(yù)編譯”。在服務(wù)器上預(yù)編譯有以下好處:

  • 可以使用你喜愛的 預(yù)處理器
  • 小小的性能優(yōu)勢, 不需要在瀏覽器里加載和執(zhí)行編譯器。
  • “單語言應(yīng)用” 以及可以在服務(wù)端預(yù)渲染標(biāo)簽。

預(yù)編譯使用 riot 命令, 用 NPM 全局安裝:

npm install riot -g

如果使用了預(yù)編譯,你的 HTML 就可以改成下面這樣:

<!-- 加載點(diǎn) -->
<my-tag></my-tag>

<!-- 包含 riot.js -->
<script src="https://cdn.jsdelivr.net/riot/2.3/riot.min.js"></script>

<!-- 包含預(yù)編譯的自定義標(biāo)簽 (正常 javascript) -->
<script src="path/to/javascript/with-tags.js"></script>

<!-- mount 方法一樣 -->
<script>
riot.mount('*')
</script>

2. 預(yù)編譯的用法

riot 命令的用法:

# 編譯到當(dāng)前目錄
riot some.tag

# 編譯到目標(biāo)目錄
riot some.tag some_folder

# 編譯到目標(biāo)路徑
riot some.tag some_folder/some.js

# 將源目錄下的所有文件編譯至目的目錄
riot some/folder path/to/dist

# 將源目錄下的所有文件編譯(合并)到單個(gè)js文件
riot some/folder all-my-tags.js

?每個(gè)源文件可以包含一個(gè)或多個(gè)自定義標(biāo)簽,也可以有標(biāo)準(zhǔn)JavaScript代碼混在里面。編譯器只會轉(zhuǎn)換自定義標(biāo)簽,其它的內(nèi)容不會動。

3. Watch模式

你可以 watch 目錄,當(dāng)文件有變化時(shí)自動編譯

# 自動檢測文件修改
riot -w src dist

4. 指定后綴名

對標(biāo)簽定義文件,你可以隨意使用后綴名 (默認(rèn)為 .tag):

riot --ext html

5. ES6配置文件

可以使用一個(gè)配置文件來保存和配置所有的 riot-cli 選項(xiàng),以及創(chuàng)建自定義解析器

riot --config riot.config

riot.config.js文件樣例:

export default {
  from: 'tags/src',
  to: 'tags/dist',
  // 文件后綴名
  ext: 'foo',
  // html parser
  template: 'foo',
  // js parser
  type: 'baz',
  // css parser
  style: 'bar',
  parsers: {
    html: {
      foo: (html, opts, url) => require('foo').compile(html),
    },
    css: {
      bar: (tagName, css, opts, url) => require('bar').compile(css),
    },
    js: {
      baz: (js, opts, url) => require('baz').compile(js),
    },
  },
};

6. Node 模塊

var riot = require('riot')

var js = riot.compile(source_string, options, url)

compile 函數(shù)接受string參數(shù),返回string.

7. 融入你的工作流程


?

預(yù)處理器

?這是預(yù)編譯的最大優(yōu)勢. 你可以使用你喜歡的預(yù)處理器來創(chuàng)建自定義標(biāo)簽。HTML 和 JavaScript 處理器都可以自定義。

1. 使用方法

?源語言使用命令行參數(shù) --type-t 來指定,也可以在<script>標(biāo)簽上指定type

<my-tag>
  <h3>My layout</h3>

  <script type="coffee">
    @hello = 'world'
  </script>
</my-tag>

2. CoffeeScript

# 使用 coffeescript 預(yù)處理器
riot --type coffee --expr source.tag

--expr 參數(shù)表示所有的表達(dá)式也做預(yù)處理. 還可以使用 “cs” 作為 “coffee” 的別名. 以下是 CoffeeScript 自定義標(biāo)簽的例子:

<kids>

  <h3 each={ kids[1 .. 2] }>{ name }</h3>

  # Here are the kids
  this.kids = [
    { name: "Max" }
    { name: "Ida" }
    { name: "Joe" }
  ]

</kids>

注意: each 屬性也是用 CoffeeScript 寫的. 你的機(jī)器上需要安裝有 CoffeeScript:

npm install coffee-script -g
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評論 25 709
  • 前端,你是文藝界的程序員 我為什么要用Riot ?優(yōu)點(diǎn)明顯,體積小,加載快,繼承了react,Polymer等框架...
    果汁涼茶丶閱讀 2,675評論 0 10
  • 果然不出徐云霞之所料,在徐云霞深厚的內(nèi)力和截拳道凌厲的進(jìn)攻面前歐陽克處處受制,六十招過后便只有招架之功卻無還手之力...
    長白居士閱讀 242評論 0 0
  • 人在行事常處同檐之下,繁事中心如矛盾針鋒相對,奈何側(cè)有風(fēng)火煽燃,背向有邪惡渾濁,本以兢兢業(yè)業(yè)自覺不愧當(dāng)?shù)?,守誠謙退...
    合易閱讀 242評論 0 0

友情鏈接更多精彩內(nèi)容