用mdx-deck和Now打造酷炫的在线幻灯片

TL;DR 本文介绍了使用mdx-deck包制作幻灯片式的网页,并利用Now v2进行部署的方法(示例代码

背景介绍

MDX: GitHub

在介绍mdx-deck之前,首先要介绍一下它的基础MDX。MDX的理念是Markdown+JSX。相信无论是对于Markdown,还是对于JSX,大家应该都已经非常熟悉了。不知道大家有没有设想过:如果能在Markdown里用上JSX组件,会是一种怎样的体验?

mdx-deck: GitHub

不知道大家有没有用过一款叫做Marp的软件,使用它可以将Markdown文件转换成幻灯片,第一次看到它的时候我还着实被惊艳了一下。

mdx-deck想要做的事情是类似的,只不过,站在MDX这个巨人的肩膀上,mdx-deck可以做得更多。话不多说,先看看下面几个示例吧:

mdx-deck提供的其他功能

作为一个幻灯片演示工具,mdx-deck还提供了其他方便的演示功能。

演示者模式

使用Option+P组合键可以进入演示者模式,并拥有演讲者计时和显示当前时间的功能。再次使用该组合键可退出演示者模式。


演示者模式
总览模式

使用Option+O组合键可以进入总览模式,可以浏览全部的幻灯片。再次使用该组合键可退出总览模式。


总览模式

Now

Now提供了面向全球的快速部署服务。在1.0版本,Now提供了staticnodedocker三种部署方式,分别用于部署静态站点、node项目和docker项目。而在最近更新的2.0版本中,Now全面转向了Serverless,口号也已经变更为“Global Serverless Deployments”。Now v2提出的一个很重要的新概念叫做“builder”,借助builder,我们可以很方便地把代码转变为Serverless的云函数。而今天我们要用到的正是其中的一个builder:@now/mdx-deck。它集成了mdx-deck所需的各种配置,这使得我们可以在几分钟的时间里完成一个mdx-deck项目的部署,而完全不需要考虑各种配置问题。

Now的优势很多,包括自动https配置,自动CDN配置,全球DNS等等,本文难以全部涵盖,有机会的话,可以在以后的文章中进行更加详尽的介绍。

准备工作

Now

我们首先需要注册一个Now的账号,这里可以使用邮箱,或者使用GitHub账号登陆。建议选择Github方式。

注册之后,我们需要在本地安装一下Now的命令行工具(CLI)

# 使用NPM
npm i -g now

# 或者使用yarn
yarn global add now

当然,也可以从Now的官网上下载桌面客户端,里面包含了CLI,还支持自动更新,也是非常方便的。

安装完毕后,我们需要在CLI或者桌面客户端登陆一下我们的账号。其中,CLI登陆的方法为:

now login

Step01 发布我们的第一个mdx-deck幻灯片

这里我们参考Now提供的教程来发布我们的第一个mdx-deck幻灯片。

1.1 创建项目

首先创建项目目录:

mkdir my-mdx-deck
cd my-mdx-deck

在新建的目录中,我们一共需要新建两个文件。index.mdx是我们幻灯片的正文,now.json用于进行Now的配置。

index.mdx

# I am using mdx-deck!
---
# This is super fun!
---
# Wanna have a try? 
Follow [this](https://zeit.co/docs/v2/deployments/official-builders/mdx-deck-now-mdx-deck/)!

可以看到,如果不使用JSX功能,写MDX和写普通的Markdown没有太大区别,只不过,普通Markdown中的分隔符标记---在MDX中表示的是开始新的一页幻灯片。这一点与Marp是一样的。

now.json

{
  "name": "mdx-deck-example",
  "version": 2,
  "builds": [
    { "src": "index.mdx", "use": "@now/mdx-deck" }
  ]
}

简单说明一下这个json文件中的几个字段:

  • name字段对应的是部署时的域名前缀(Now部署项目的默认URL是<name>-<uuid>.now.sh),如果不设置name,则会默认用目录名作为name
  • version字段表示我们使用的是Now v2(Now目前是1.02.0两个版本并存的状态,并且相当长的一段时间内都会是如此)
  • builds字段是最为关键的部分,它是一个数组,我们可以针对项目中的不同文件使用不同的builder。这里,我们针对index.mdx使用了@now/mdx-deck这个builder。每一个builder都对应着一套编译环境,@now/mdx-deck会帮助我们把MDX文件转换为最终用于渲染的HTML和JavaScript。

1.2 部署项目

之后我们就可以部署这个项目了。在项目根目录执行

now

是的,你没有看错,就这么简单!之后我们会在命令行中看到部署的进度:

> Deploying .../my-mdx-deck-example under xxx
> Synced 2 files (283B) [1s]
> https://mdx-deck-example-prr0bcnpc.now.sh [v2] [in clipboard] [1s]
- index.mdx Building

构建完成后的提示为:

┌ index.mdx Ready [51s]
├── index.html (4.9KB)
└── main.js (286.94KB)
> Success! Deployment ready [53s]

这时,我们就可以点击链接来查看刚刚部署的幻灯片了。是不是感觉so easy?

Step01 第一个幻灯片

你可能会觉得Now自动生成的URL太丑陋了,没关系,Now提供了alias功能,你可以为刚刚生成的URL设置一个别名。方法也很简单:

now alias mdx-deck-example-step01

之后,就可以在https://mdx-deck-example-step01.now.sh看到跟刚刚一样的页面了。

注:alias命令的标准使用方法为now alias <原始URL> <新URL>,上面使用了简略方法:

  • 在刚刚完成一次Now部署的目录中,会默认以上一次部署的URL作为原始URL
  • 新URL如果不写成完整的域名形式,会默认发布为xxx.now.sh。如果对应的域名已经被占用,就会发生错误。

Step02 使用mdx-deck自带的工具

mdx-deck本身就为我们提供了不少工具,包括主题(Themes)组件(Components)布局(Layouts)等,这一步中,我们将实际尝试mdx-deck自带的各种工具。

注意!当在代码中混合使用JSX和Markdown语法时,需要在代码交界处加一个空行,以保证编译构建过程能够正常进行。

2.1 使用Head组件

Head组件的作用是设置HTML的<head>属性。这里我们利用Head组件给我们的幻灯片页面起一个标题,并增加一个<meta>字段。

index.mdx

import { Head } from 'mdx-deck'

[comment]:省略部分内容

<Head>
  <title>Mdx-deck Examples</title>
  <meta name='twitter:title' content='Mdx-deck Examples' />
</Head>

修改完成后我们使用now再次部署,打开页面,我们可以看到它已经有了一个正确的标题;查看网页源码,可以看到<meta>字段也已经成功添加了。

注:理论上来说,<Head>可以添加在任何一张幻灯片的开头或结尾(不能与Markdown内容混杂),但是在尝试时,我遇到了几次错误,最终像上面这样把<Head>放置在最后一张幻灯片的结尾才顺利构建。不清楚这个是不是@now/mdx-deck在我写作本文时存在的一个bug。

2.2 使用Image组件

Image组件可用于创建一页单张图片的幻灯片。用法同样很简单,我们在第二页的后面新增一页,放上一张图片(这里实际上我放了一张GIF动图)。

index.mdx

import { Head, Image } from 'mdx-deck'

# I am using mdx-deck!
---
# This is super fun!
---
<Image src='https://s3.amazonaws.com/jxnblk/mdx-deck.gif' />
---
# Wanna have a try? 
Follow [this](https://zeit.co/docs/v2/deployments/official-builders/mdx-deck-now-mdx-deck/)!

<Head>
  <title>Mdx-deck Examples</title>
  <meta name='twitter:title' content='Mdx-deck Examples' />
</Head>

再次部署后的页面如下图所示:

Step02 使用Image组件

2.3 使用Appear组件

Appear组件用于实现同一页面上子元素逐个出现的效果,对于列表的展示最为适合。

index.mdx

import { Appear, Head, Image } from 'mdx-deck'

[comment]: 省略部分内容

[comment]: 这里插入一张新幻灯片,使用Appear组件

# Make a list live!

Here comes the list.
<ul>
  <Appear>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
  </Appear>
</ul>
---
# Wanna have a try? 

[comment]: 省略部分内容

<Appear>内部的元素会按照次序逐个出现。部署后的页面效果如下图所示:

Step02 使用Appear组件

2.4 使用Notes组件

Notes组件的作用是演讲者笔记。这些笔记只有在演示者模式(Option+P)中才可见,对于幻灯片演讲者来说有很大的帮助。Notes组件有两种使用方法(Markdown语法和JSX语法),都很简单,这里以Markdown语法为例进行介绍。

我们在index.mdx文件中的第二张幻灯片里加上下面的内容:

```notes
This sentence can only be seen in presenter mode.
```

部署后的页面演示者模式下的效果如下图所示:

Step02 使用Notes组件

可以看到第二张幻灯片下方的笔记。

2.5 使用mdx-deck自带的Layouts

mdx-deck自带的布局有Invert(反色)、Split(左右二分,第一个元素出现在左边)、SplitRight(左右二分,第一个元素出现在右边)、FullScreenCode(全屏展示代码块)等。接下来,我们就来实际体验一下Invert和Split的效果吧。

index.mdx

import { Appear, Head, Image } from 'mdx-deck'

[comment]: 引入Invert和Split布局

import { Invert, Split } from 'mdx-deck/layouts'

[comment]: 使用Invert布局

export default Invert

# I am using mdx-deck!
---

[comment]: 省略部分内容

---

[comment]: 使用Split布局

export default Split

# Wanna have a try? 
Follow [this](https://zeit.co/docs/v2/deployments/official-builders/mdx-deck-now-mdx-deck/)!

<Head>
  <title>Mdx-deck Examples</title>
  <meta name='twitter:title' content='Mdx-deck Examples' />
</Head>

部署后的页面效果如下图所示:

step02-layouts.gif

可以看到,幻灯片的首页变成了反色,而最后一页变成了左右双栏的布局模式。

Step03 基于mdx-deck的二次开发

将在以后的文章中进行介绍。

mdx-deck的不足

mdx-deck还是一个刚刚起步不久的项目(MDX自己出来也还没有多长时间),所以现在功能上还有很多需要完善的地方。其中对我自己来说影响比较大的几点包括:

  • 不能够同时使用多种Layout(比如说Split+Invert,不过可以通过自定义Layout的方式来实现自己想要的布局)。
  • 目前不支持MathJax公式渲染。

mdx-deck的作者非常欢迎大家贡献自己的PR,所以如果对某个功能有迫切的需求,不妨自己来撸一个PR吧!

总结

在这篇文章中,我们介绍了利用mdx-deck和Now v2制作在线幻灯片的基本流程和方法,以及mdx-deck中自带组件的使用方法。在以后的文章中,我将会继续给大家介绍与MDX,mdx-deck,以及Now有关的更多内容,敬请期待。

附录

项目代码

示例项目分步骤的全部代码可以在这个GitHub仓库获取到。

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