11 tyを使用したWebコンポーネントの使用
22189 ワード
このポストは、私の個人的なブログを構築することに関係していたものの1つを記述しますgriffa.dev , もっと詳細とライブデモを読むこと自由に感じるthere .
私はこのブログで基本的に物事を持ち帰りたいと思っています.これに加えて、私は11 tyを使用することによって、私は私の投稿のHTMLを追加するには無料であることを意味、Markdownで著者をすることができます.
しかし、私はHTML/CSSに焦点を当てているwhistは、それがJavaScriptでは、余分な双方向性のために、これはWebコンポーネントが入ってくる場所に散らばる意味がある領域があります.
おい!彼はウェブのコンポーネントを、彼を取得!(チーウィーとボーは本当に友達です).
Googleエンジニアは、私がそうすることができたよりよくそれを言いました:
ジャスティンファゴニ
第11に、そして、ウェブ構成要素は本当に本当に行きます.
午後21時24分
8
57
この記事では、Webコンポーネントの開発環境の設定について説明します.
しかし、最初に、私はこのサイトのWebコンポーネントを消費するために取ったアプローチを議論したい.すべてのコンテンツは利用可能なJavaScript/Webコンポーネントなしで利用できるようにする必要がありますが、利用可能な場所では、コンテンツを徐々に強化する必要があります.
JavaScriptを使用して、徐々に強化されたコンテンツのために使用したユースケースの2つがあります.
進歩的な強化を通してYouTubeビデオを埋め込むために、あなたは最初に内容の最小限のHTMLだけの実現であることを確認する必要があります、これは以下の通りです クリックすると、ビデオに移動するリンク. ラップのリンクに使用するイメージのサムネイル. ビデオのキャプション、アクセシビリティにとって重要です. この2番目の部分はYouTubeプレーヤーを埋め込むために使用するコンポーネントを識別しています.
ここから完璧なフィット感です. からの背景画像サーバ. がある OnClick新しいタブを開くことを防ぐ. onclickを説明すること:ここで起こっているwhatsは、そうです. ウェブコンポーネント/JavaScriptがサイトで利用できないならば、OnClickは無視されます、そして、予想通りのリンク JS/Webコンポーネントが有効になってリンクがクリックされると、タブは開きません.
いくつかの時点で私は私のライブデモを正確にどのように11 tyでMarkdownを使用して作成されたの詳細に入る投稿を行う必要がありますが、最終的には、Webコンポーネントを使用してレンダリングされます.
ここでは、HTMLを受け入れるライブデモWebコンポーネントとCSSのコンテンツとしてCSSです.
アクションヘッドでライブデモhere .
私はスロットを使いました
このアプローチは
特に、あなたが純粋なJavaScriptを使用しているなら、そして、どんなビルド・プロセスも必要としないでください.私は、ビルドプロセスを持っていないことが新鮮な空気のような息だった、開発ツールはちょうどあなたの方法から取得する必要がありますし、コードを聞かせてください.
あなたがNPMからいくつかのコンポーネントやライブラリを使用する場合は
これは私たちにあなたの11 tyサイトのすべてのライブビルを与えるが、サーバーなし.
我々のサーバーのために、ここはどこです
このためには、小さな設定ファイルを導入し、次のように簡単なミドルウェアを実装する必要があります. リクエストが11 tyの資産であるならば リクエストがHTMLページの場合、 に移動 ファイル呼び出しを作成する port :サーバのローカルポート ウォッチ:ブラウザを再読み込みするたびに何かを変更する rootでなければなりません. ミドルウェア:リクエストで実行される関数は、すぐにServe 11 tyAttributesを説明します. noderesolve :変換するフラグ
あなたが簡単に例えばGulp
11 tyプロジェクト用のJavaScriptを最適化するためのツールの選択に関しては、選択は完全にあなた次第です.私のように、複雑なビルドを設定したくないなら、他の人の偉大な仕事を活用してOpen WC rollup config .
これが私の設定です.
これをフックするために
これをAとして出力できますdata file あなたが欲しかったならば、しかし、私は私のスクリプトにもう少し多くの論理を加えたかったので
ファイルを作成する
NODERADER ENVフラグを設定する方法を考えているなら、ここに私のビルドスクリプトがあります.
私はこのブログで基本的に物事を持ち帰りたいと思っています.これに加えて、私は11 tyを使用することによって、私は私の投稿のHTMLを追加するには無料であることを意味、Markdownで著者をすることができます.
しかし、私はHTML/CSSに焦点を当てているwhistは、それがJavaScriptでは、余分な双方向性のために、これはWebコンポーネントが入ってくる場所に散らばる意味がある領域があります.
おい!彼はウェブのコンポーネントを、彼を取得!(チーウィーとボーは本当に友達です).
Googleエンジニアは、私がそうすることができたよりよくそれを言いました:
ジャスティンファゴニ
第11に、そして、ウェブ構成要素は本当に本当に行きます.
午後21時24分
8
57
この記事では、Webコンポーネントの開発環境の設定について説明します.
しかし、最初に、私はこのサイトのWebコンポーネントを消費するために取ったアプローチを議論したい.すべてのコンテンツは利用可能なJavaScript/Webコンポーネントなしで利用できるようにする必要がありますが、利用可能な場所では、コンテンツを徐々に強化する必要があります.
漸進的強化Webコンポーネントユースケース
JavaScriptを使用して、徐々に強化されたコンテンツのために使用したユースケースの2つがあります.
ユーチューブ
進歩的な強化を通してYouTubeビデオを埋め込むために、あなたは最初に内容の最小限のHTMLだけの実現であることを確認する必要があります、これは以下の通りです
ここから完璧なフィット感です.
npm install lite-youtube-embed
<lite-youtube class="video" videoid="j8mJrhhdHWc" style="background-image: url('https://i.ytimg.com/vi/j8mJrhhdHWc/hqdefault.jpg');">
<a onclick="('customElements' in window) && event.preventDefault()" title="Play Video" class="no-js" target="_blank" href="https://youtube.com?w=j8mJrhhdHWc">{% include "img/play.svg" %}</a>
</lite-youtube>
上記の2 , 3の事柄があります.<a>
デフォルトで、これは新しいタブでYouTubeビデオを開きますcustomElements
はブラウザでサポートされています.lite-youtube
, Youtubeで埋め込む結果.ライブコードデモ
いくつかの時点で私は私のライブデモを正確にどのように11 tyでMarkdownを使用して作成されたの詳細に入る投稿を行う必要がありますが、最終的には、Webコンポーネントを使用してレンダリングされます.
ここでは、HTMLを受け入れるライブデモWebコンポーネントとCSSのコンテンツとしてCSSです.
アクションヘッドでライブデモhere .
<live-demo id="my-live-demo">
<div slot="html">
<div class="my-div">styled by the css</div>
</div>
<div slot="css">
.my-div {
color: var(--Primary, blue);
}
</div>
</div>
ここで撮ったアプローチは、Webコンポーネントが利用できない場合、コードがレンダリングされ、構文が強調表示されますが、JSが有効になっている場合は、ライブのデモコンポーネントが表示されます.ブラウザでJavaScriptを無効にする場合は、代わりにコードスニペットを見る必要があります.私はスロットを使いました
js
一つhtml
と1つcss
. Webコンポーネントは、テキストコンテンツを受け取り、適切にレンダリングします.このアプローチは
a lot
私は将来的に私のブログのために使用したいと思いますが、どのように私は自分自身を構築することができますを参照してくださいに面白かった.11 tyおよびWebコンポーネントのためのdev環境の設定
特に、あなたが純粋なJavaScriptを使用しているなら、そして、どんなビルド・プロセスも必要としないでください.私は、ビルドプロセスを持っていないことが新鮮な空気のような息だった、開発ツールはちょうどあなたの方法から取得する必要がありますし、コードを聞かせてください.
If you are just working with vanilla web components and don't want to use any dependencies from NPM, then good news, you don't need to do anything special, just use the default 11ty dev server, and move on to create great content!
あなたがNPMからいくつかのコンポーネントやライブラリを使用する場合は
bare imports
ブラウザで動作する相対URLに.import { LitElement } from "lit-element";
次のようになります.import { LitElement } from "./../node_modules/lit-element/lit-element.js";
これを行うための最良のツールはhttps://www.npmjs.com/package/es-dev-server .At the time of writing this tool is in the process of getting moved over to @web/dev-server. For this example, i'll use
@web/dev-server
butes-dev-server
would work too.
npm i --save-dev @web/dev-server
最初に、あなたが通常使用する11 tyのウェブサイトを提供するときnpx eleventy --serve
, しかし、代わりに我々は使用するつもりですnpx eleventy --watch
.これは私たちにあなたの11 tyサイトのすべてのライブビルを与えるが、サーバーなし.
我々のサーバーのために、ここはどこです
@web/dev-server
が実行されます.web-dev-server --node-resolve --open
これらの2つのタスクを結合するためにconcurrently
npm i concurrently --save-dev
そして、それらをNPMスクリプトに組み合わせる: "start": "concurrently \"npx eleventy --watch\" \"web-dev-server --node-resolve\"",
上記の組み合わせはdevサーバを提供しますが、私たちは_site
フォルダだけでなく、ノードのモジュールを解決する.このためには、小さな設定ファイルを導入し、次のように簡単なミドルウェアを実装する必要があります.
_site
付録で_site
URLへ._site
next()
これにより、JSファイルをESMインポートを解決するロジックで処理できるようになります.web-dev-server.config.js
module.exports = {
port: 8000,
watch: true,
rootDir: ".",
middleware: [
serve11tyAssets({dist: "_site_"})
],
nodeResolve: true
};
これはすべてうまくいけば理解できるようになるはずです.node_modules
そして、11代_site
フォルダ.import foo from 'bar'
serve11tyAssets
このように見えるでしょう.const path = require("path");
const fs = require("fs").promises;
const URL = require("url").URL;
/**
*
* Check if asset lives in 11ty _site folder, if not serve from root folder.
*/
const serve11tyAssets = ({dist = "_site"} = {}) => {
return async (context, next) => {
// Node URL requires a full url so... whatever.com (url isnot important)
const pathName = new URL(`https://whatever.com${context.url}`).pathname;
// is the request for a html file?
const url = pathName.endsWith("/") ? `${pathName}index.html` : pathName;
try {
// check if the file exists, if so, modify the url to come from `_site` folder.
const stats = await fs.stat(path.join(dist, url));
if (stats.isFile()) {
context.url = `/${dist}${pathName}`
}
return next();
} catch {
return next();
}
}
}
うまくいけば、この例は意味をなします、そして、それがあなたの11 ty開発サーバーにバニラJavaScriptモジュールを加えることがどれくらい単純かを示します.あなたが簡単に例えばGulp
"start": "npx gulp && concurrently \"npx gulp watch\" \"npx eleventy --watch\" \"web-dev-server\""
JavaScriptの最適化
11 tyプロジェクト用のJavaScriptを最適化するためのツールの選択に関しては、選択は完全にあなた次第です.私のように、複雑なビルドを設定したくないなら、他の人の偉大な仕事を活用してOpen WC rollup config .
これが私の設定です.
npm i rollup deepmerge rollup-plugin-output-manifest @open-wc/building-rollup -D
import merge from "deepmerge";
import { createBasicConfig } from "@open-wc/building-rollup";
import outputManifest from "rollup-plugin-output-manifest";
const entrypoints = {
index: "src/assets/index.js"
};
const baseConfig = createBasicConfig({
outputDir: "dist/assets"
});
export default merge(baseConfig, {
input: entrypoints,
plugins: [outputManifest({
// ../ to go outside of dist and into include
fileName: '../../src/_includes/manifest.json',
// assets is my folder of choice for js files
publicPath: 'assets/'
})]
});
いくつかのページにいくつかのコンポーネントをロードする場合に便利です.これをフックするために
11ty
使用しているrollup-plugin-output-manifest
. この出力はmanifest.json
ファイル.これをAとして出力できますdata file あなたが欲しかったならば、しかし、私は私のスクリプトにもう少し多くの論理を加えたかったので
production
モードかどうか.ファイルを作成する
src/_data/assets.js
, として読み込むGlobal Data File .module.exports = {
getPath: (assetName) => {
if (process.env.NODE_ENV === "production") {
const assets = require("../_includes/manifest.json");
const modulePath = assets[assetName];
if(!modulePath) {
throw new Error(`error with getAsset, ${assetName} does not exist in manifest.json`);
}
return `/${modulePath}`;
} else {
return `/src/assets/${assetName}`;
}
}
}
その後、11 tyテンプレートで <script src="{{ assets.getPath("index.js")}}" type="module"></script>
これを行うと、開発時には変更されていないSRCコードにサービスを提供することができましたが、キャッシュ・バスティンの名前でハッシュを持つ生産資産を埋め込んだだけです.NODERADER ENVフラグを設定する方法を考えているなら、ここに私のビルドスクリプトがあります.
"build": "rm -rf dist && NODE_ENV=production rollup -c rollup.config.js && NODE_ENV=production npx eleventy"
そして、それは私のセットアップです、私は確かにこれをするより良い方法があると確信しています、しかし、うまくいけば、これは役に立ちました.Reference
この問題について(11 tyを使用したWebコンポーネントの使用), 我々は、より多くの情報をここで見つけました https://dev.to/griffadev/using-web-components-with-11ty-5e48テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol