diff --git a/tutorial/comi-principle.md b/tutorial/comi-principle.md new file mode 100644 index 000000000..79474798c --- /dev/null +++ b/tutorial/comi-principle.md @@ -0,0 +1,134 @@ +# Comi - 小程序 markdown 渲染和代码高亮解决方案 + +Comi 读 ['kəʊmɪ],类似中文 科米,是腾讯 Omi 团队开发的小程序代码高亮和 markdown 渲染组件。 + + + +### 体验 + +![](https://github.com/Tencent/omi/raw/master/assets/omi-cloud.jpg) + +Comi 基于下面的 5 个组件进行开发: + +* prismjs +* wxParse +* remarkable +* html2json +* htmlparser + +先看 Comi 使用,再分析原理。 + +## 使用 + +先拷贝 [此目录](https://github.com/Tencent/omi/tree/master/packages/comi/mp/comi) 到你的项目。 + +js: + +```js +const comi = require('../../comi/comi.js'); + +Page({ + onLoad: function () { + comi(`你要渲染的 md!`, this) + } +}) +``` + +wxml: + +```html + +``` + +wxss: + +```css +@import "../../comi/comi.wxss"; +``` + +简单把! + +### 在 omip 中使用 + +先拷贝 [此目录](https://github.com/Tencent/omi/tree/master/packages/comi/omip/src/components/comi) 到你的项目。 + +js: + +```jsx +import { WeElement, define } from 'omi' +import './index.css' +import comi from '../../components/comi/comi' + +define('page-index', class extends WeElement { + + install() { + comi(`你要渲染的 md`, this.$scope) + } + + render() { + return ( + + + + ) + } +}) +``` + +css: + +```css +@import '../../components/comi/comi.wxss'; +``` + +## 原理 + +在开发 Comi 之前,我们进行了预研,是否有必要造这个轮子。 + +### 代码高亮预研 + +* wxParse 只是用标签包括代码,并未处理代码转成 WXML,所以渲染出的代码是没有颜色 +* 老牌的 highlightjs 没有 WXML 对应的方案 +* 老牌的 highlightjs 对 JSX 高亮支持太差 +* prismjs 是 react 官方使用的高亮插件,对 JSX 支持高亮很好 +* prismjs 支持几乎所有的语言,并且支持自定义扩展语言 +* prismjs 拥有 Line Highlight 插件(目前还未移植到 Comi) + +综合上面信息,决定基于 prismjs 二次开发。 + +### markdown 渲染预研 + +* wxParse 老牌的渲染组件,支持 markdown +* wxParse 内置的 showdownjs 不满足代码高亮的格式需求(比如语言种类也会生成一个标签,当然可以通过 wxss 隐藏) +* 小程序基础库 1.4.0 开始支持 `rich-text` 组件展示富文本,但是格式需要转成 json +* 高性能 remarkable,Facebook 和 Docusaurus 都在使用,支持 md 语法修改和扩展 + +```html + +``` + +```js +Page({ + data: { + nodes: [{ + name: 'div', + attrs: { + class: 'div_class', + style: 'line-height: 60px; color: red;' + }, + children: [{ + type: 'text', + text: 'Hello World!' + }] + }] + }, + tap() { + console.log('tap') + } +}) +``` + +综合上面信息,放弃 rich-text,决定基于 wxParse + remarkable 二次开发,移除 showdownjs。Comi 需要 remarkable 的高性能和灵活性。markdown 会持久化存在 db, 在小程序内运行时转换成 wxml,所以对性能还是有一定要求。 + + + diff --git a/tutorial/compute-cache.cn.md b/tutorial/compute-cache.cn.md index 9ae9d5067..8d4cb8660 100644 --- a/tutorial/compute-cache.cn.md +++ b/tutorial/compute-cache.cn.md @@ -10,7 +10,7 @@ function cacher(fn) { } } -const add = cacher( (a, b) => a + b) +const add = cacher((a, b) => a + b) add(1, 3) //第一次计算