mithril.js

mithril.js是什么

Mithril is a modern client-side Javascript framework for building Single Page Applications. It's small (< 8kb gzip), fast and provides routing and XHR utilities out of the box.

Mithril 是一个客户端 javascript MVC 框架,即它是一个工具,使应用程序代码分为数据层(Model), UI 层(View),黏合层(Controller)。

mithril.js特点
  1. 轻量级。总共1200行代码,gzip 之后只有几kb,无依赖;api非常少
  2. 快速。虚拟dom和编译模版;智能redrawing


    vs.png

上图为官方给出的对比图,但是他为什么会这么小呢?其实是因为它做了比较少的事情。事实上mithril.js仅仅提供了以下几个功能

  • 基于 HyperScript 构建 Virtual DOM
  • DOM diff
  • 双向绑定
  • AJAX
  • 路由
  • 兼容 JSX
mithril.js和vue2的对比

相同:

  1. 它们都使用虚拟DOM和生命周期方法
  2. 两者都通过组件组织视图

不同:

  1. 模版
// vue 的模版
<template lang='pug'>
.temp-demo-wrap
  p.temp-demo-title hello word
</template>

// mithril模版
m('div', {class: 'temp-demo-wrap'}, [
  m('p', {class: 'temp-demo-title'}, 'hello word')
])
  1. Vue提供双向数据绑定和状态管理,而mithril是没有的这个部分的
简单的使用和demo展示
  1. 基本的使用
  • 安装
npm install mithril --save
  • 构建你的第一个app
// index.js
var m = require("mithril")
m.render(document.body, "hello world")
  1. 用mithril.js实现一个简单的点击请求成功后累加的demo
var root = document.body
var count = 0

var increment = function() {
  m.request({
    method: "PUT",
    url: "//rem-rest-api.herokuapp.com/api/tutorial/1",
    data: {count: count + 1},
    withCredentials: true
  }).then(function(data) {
    count = parseInt(data.count)
  })
}

var Hello = {
  view: function() {
    return m("main", [
      m("h1", {
        class: "title"
      }, "My first app"),
      m("button", {
        onclick: increment
      }, count + " clicks"),
    ])
  }
}

m.mount(root, Hello)
mithril.js 关键概念
  1. 虚拟DOM
  2. components(所有带有view的都是一个mithril的组件,可以m()来调用)
// comp.js
m.m_factory({
  viewModel: function () { 
    // ...
  },
  controller: function () {
    // ....
  },
  view: function (ctrl, param) {
    return m('div.m-demo-components', [
      m('h3', {
        onclick: param.show.bind(param.ctrl),
        style: {
          'background-color': '#fff'
        }
      })
    ])
  }
})
var comp = require(./componemts/comp.js)
m.m_factory({
  viewModel: {
    list: [],
    show: function () {
      console.log('show')
    },
    getList: function () {
      m.request({
        methods: 'get',
        url: '',
        data: {}
      }).then((data) => {
        this.list = data.list || []
      })
    }
  },
  controller: function () {
    var vm = this.viewModel
    vm.getList()
  },
  view: function (ctrl) {
    var dataList = ctrl.list
    return m('div', [
      m('p', 'test'),
      m(comp, {
        ctrl: ctrl,
        show: ctrl.show
      })
    ])
  }
})
  1. 生命周期(oninit, oncreate, onbeforeupdate, onupdate, onbeforeremove, onremove)
  2. key:允许在NodeList内重新排序DOM元素的机制,并且随着数据项在列表内移动,将列表中的特定数据项映射到从其派生的各个DOM元素。参考:https://mithril.js.org/keys.html
  3. 自动重新绘制系统(调用m.mount或m.route时,自动重新绘制系统变为启用状态;但如果您的应用程序仅通过m.render调用进行引导,则它将保持禁用状态)
使用后的一些总结
  1. 推荐使用第一种写法,虽然它是非强制的(下面两种写法结果是一样的)
var MyComponent = {
  view: function() {
    return m("main", [
      m("h1", "Hello world"),
    ])
  }
}

var MyComponent = {
  view: function() {
    return (
      <main>
        <h1>Hello world</h1>
      </main>
    )
  }
}
  1. 没有任何关于动画的API,如果要做动画只能通过钩子自己去实现。例如onbeforeremove这个钩子可以在元素删除之前
  2. 路由是hash的模式
  3. m.fragment 创建一个不存在的临时节点(类比document.createDocumentFragment())
m("ul", [
  m("li", "child 1"),
  m("li", "child 2"),
  groupVisible ? m.fragment({oninit: log}, [
    // a fragment containing two elements
    m("li", "child 3"),
    m("li", "child 4"),
  ]) : null
])
  1. 仅提供基本的一些方法并不是一个强大的很全面的框架。解决基本的温饱问题,但是没有“华丽的服饰”提供
为什么可以考虑选择它

Mithril 本体目前还非常活跃,现在的它能够解决基本的问题,例如数据控制dom更新,路由,XHR;但周围生态极其贫乏,与 Vue、React 相比处于劣势。如果需要构建重量级 SPA 可能会差一点。但由于本体非常小,学习成本低,可以接入到任何网页实现部分组件化,所以还是非常值得推荐的。而且也有了生产环境使用案例,像 vimeo,nike,Flarum 都在产品中使用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • Mithril.js 是一个客户端的 JavaScript MVC 框架。 随着 Flarum 也使用了 Mith...
    justjavac阅读 2,632评论 1 4
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,046评论 0 29
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,330评论 0 2
  • HTML HTML5标签 媒体查询head部分写法 Doctype作用? 严格模式与混杂模式如何区分?它们有何意义...
    Mayo_阅读 640评论 0 8
  • 不是因为旋律多动听,是因为你恰好有这个故事
    shenghui阅读 198评论 0 0