介紹 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。

接下來是什麼

嗯,在某種程度上這取決於您。要告訴我們您想看到什麼,您可以 在我們的調查中提供反饋