介绍 MDN Playground:让您的代码焕发生机!

阅读时间 6 分钟

在 Mozilla,我们一直在努力赋能 Web 开发者,为他们提供最好的资源,让他们在 Web 上创造出惊艳的体验。今天,我们非常激动地宣布 MDN 的一项开创性新功能——MDN Playground!(是的,您没听错,也许听起来有点太激动了)。

MDN Playground 是什么?

MDN Playground 基本上就是您所期望的那样——一种预览 HTML、CSS 和 JavaScript 的简单方法。目前它涵盖了大多数基础功能;例如基础的自动完成、使用独一无二的 prettier 进行格式化,以及分享您精彩作品的选项 (前提是您已 登录)。

为什么是 MDN Playground?

这是一个好问题。市面上有许多 Playground,那为什么还要再来一个呢?理论上,构建一个 Playground 并不复杂 (这里对“理论”用了很大的 <em>),而且我们希望它能与 MDN 集成。所以我们想,为什么不自己写一个呢,这是最后的遗言

玩笑归玩笑,在 MDN 上拥有一个 Playground 的想法一直存在。在我们的文章中加入交互式示例是一个不错的开始,但有些东西需要更多的空间和更多的自由。分享您的想法和解决方案至关重要,这不应该是第三方体验。但有一件事感觉像是改变游戏规则的小事,那就是与我们现有的 实时示例 的集成。

您现在可以将 MDN 上任何现有的实时示例“拆解”到 Playground 中 (查找实时示例上方的那个小小的 Play 按钮)。这使您能够修改您刚刚阅读过的代码,这有助于更好地理解正在发生的事情,或者将自定义版本发送给您的朋友。别现在就迷失其中,但可以看看这个 随机动画示例,您现在可以对其进行混编。

html
<h1>Hello MDN Playground</h1>

我希望这在某种程度上解释了“为什么”。这将使我们能够统一显示和交互代码的方式,接下来是 交互式示例

MDN Playground 的主要功能

一些产品功能,基本上是真的,但我们真的很想推广它 (所以请带点 🧂 来理解)

即时原型设计

MDN Playground 提供了一种无忧无虑的方式,可以快速原型化和测试您的想法。只需将您的 HTML、CSS 和 JavaScript 代码写入或粘贴到 Playground 中,即可在预览区域中即时看到结果。无论您是进行小的调整还是构建复杂的 Web 应用程序,Playground 都提供了一个量身定制的空间来满足您的需求。

实时交互

除了静态代码示例之外,MDN Playground 还通过启用交互性使代码栩栩如生。您可以实时与您的代码进行交互,进行更改并立即观察其效果。这种动态反馈循环能够快速迭代并更深入地理解不同代码片段的行为。

扩展代码示例

我们知道,在文档中阅读代码示例却无法立即进行实验是多么令人沮丧。有了 MDN Playground,这个问题将成为过去。每当您在 MDN 上遇到代码示例时,您都会发现一个方便的 Play 按钮。点击它将在 MDN Playground 中打开该示例,您可以对其进行探索和修改。

协作功能

MDN Playground 还支持协作,使与同事的合作或向社区寻求帮助比以往任何时候都更容易。您可以与他人共享您的代码 Playground,让他们能够查看和混编您的代码。无论您是协作一个项目还是获得关于您代码的反馈,Playground 都为全球开发者营造了一个协作环境。

如何访问 MDN Playground

要开始使用 MDN Playground,只需访问 developer.mozilla.org/en-US/play 并进入交互式 Web 开发的世界。该 Playground 在所有现代 Web 浏览器上均可访问,并且完全免费使用。

加入社区

MDN Playground 不仅仅是一个工具,它是一个社区驱动的倡议。我们鼓励您加入我们充满活力的开发者社区,在这里您可以分享您的经验,向他人学习,并为 Playground 的发展做出贡献。共同努力,我们可以塑造 Web 开发的未来,并使其对每个人都更加易于访问。

总结

MDN Playground 是我们持续努力为开发者提供最佳工具和资源的又一个重要里程碑。通过其与 MDN Web Docs 的无缝集成、即时原型设计能力、实时交互和协作功能,Playground 必将彻底改变您实验代码的方式。

我们邀请您今天就探索 MDN Playground,并在您的 Web 开发之旅中解锁新的创造力和生产力水平。让我们一起构建明天的 Web!

编码愉快!(如果您想知道 这是如何工作的,请继续阅读)。

演示

旋转的 Firefox

html
<div class="scene">
  <div class="cube">
    <div class="face front"></div>
    <div class="face back"></div>
    <div class="face right"></div>
    <div class="face left"></div>
    <div class="face top"></div>
    <div class="face bottom"></div>
  </div>
</div>

一把键盘

html
<div id="synth">
  <div class="keyboard">
    <div class="key white" data-note="C"></div>
    <div class="key black" data-note="C#"></div>
    <div class="key white" data-note="D"></div>
    <div class="key black" data-note="D#"></div>
    <div class="key white" data-note="E"></div>
    <div class="key white" data-note="F"></div>
    <div class="key black" data-note="F#"></div>
    <div class="key white" data-note="G"></div>
    <div class="key black" data-note="G#"></div>
    <div class="key white" data-note="A"></div>
    <div class="key black" data-note="A#"></div>
    <div class="key white" data-note="B"></div>
  </div>
</div>

幕后

编辑

我们决定使用 CodeMirror 进行编辑。正如他们所说:

CodeMirror 是一个 Web 代码编辑器组件。它可以在网站中使用,以实现支持多种编辑功能。它具有丰富的编程接口,允许进一步扩展。

我们考虑过 Monaco,但最终决定采用更轻量级的方法。到目前为止,这似乎是一个正确的选择,让我们等待 反馈

运行和通信

在一个 <iframe> 中使用一个简单的 runner.html。这还有更多内容。该 <iframe> 指向 <random-uuid>.mdnplay.dev,这样我们就隔离了所有实例。runner.html 通过 MDN 的 postMessage 获取要执行的代码。它并没有做太多。给定一个名为 state 的代码对象,例如 { html: "some HTML", css: "some CSS", js: "some JavaScript" },这就是正在发生的事情:

js
// Add CSS via a style tag to head
const style = document.createElement("style");
style.textContent = state.css;
document.head.appendChild(style);

// Setting HTML to the body.
// This could just be document.body.innerHTML = state.html
// But this won't execute script tags (which we want).
setHTML(document.body, state.html);

// Add JavaScript via script tag to the body
const script = document.createElement("script");
script.textContent = state.js;
document.body.appendChild(script);

dispatchEvent(new Event("load"));

如果您想深入了解细节,请阅读 runner.html

分享和格式化

您可以通过使用“复制 Markdown 到剪贴板”按钮来分享您的 Playground,这样就可以轻松地将 Playground 代码包含在 MDN 文章中或将其添加到 GitHub issue 中。如果您想分享的不仅仅是纯代码,并且希望人们能够预览和交互,您可以创建一个 Playground 的永久链接 (您需要 登录)。如果您收到一个共享的 Playground,并且其内容是恶意的或不恰当的,您可以举报该 Playground,我们会处理它

格式化是基础但很完善。我们只是让 prettier 来处理工作并发表它的意见。您可以选择按下按钮,所以如果您喜欢一行精简的代码,请便。

拆分实时示例

我们还在寻找这里的最佳措辞,移至 Playground展开到... 等等。我们会看到的。它叫什么名字并不那么重要。在开发 Playground 的过程中,我发现它非常有用;它改变了我日常工作中对 MDN 的使用方式。

早些时候,实时示例是在部署过程中构建的。我们不去细说,但它很糟糕,而且不幸的是现在仍然如此。为了支持当前的实时示例,我们抓取页面以查找正确的代码片段并将它们粘合在一起。在一个美好的新世界里,这看起来会像这样:

html
<pre class="html live-sample___breaking">
  <h1>Breaking the internet!</h1>
</pre>
<pre id="output"></pre>
js
function getCode(cls) {
  const code = {};
  document.querySelectorAll(`pre.live-sample___${cls}`).forEach((pre) => {
    let lang = getLanguage(pre);
    if (lang === null) {
      return;
    }
    code[lang] = (code[lang] || "") + pre.textContent;
  });
  return code;
}

所以一旦我们有了代码,我们就如上所述将其发送到 iframe,或者将其放入 sessionStorage 中,然后通过 Play 按钮将用户发送到 Playground。

接下来是什么

嗯,在某种程度上这取决于您。要告诉我们您想看到什么,您可以 在我们的调查中提供反馈