ハウステンボス画像( 11 ty )の最適化方法
22561 ワード
Originally Published on my blog
イメージを持つサイトを構築するには、最適化する必要があります
任意のコンテンツのシフトを避けるために、良いユーザーエクスペリエンスを提供します.
それを達成するためには、圧縮、サイズ変更、および画像の形式を変換する必要があります.
この記事では、私たちはあなたのイメージを
静的サイト生成ウェブサイトeleventy-img , and sharp .
新しいディレクトリを作成し、名前を付けます
その後、実行
今すぐインストール
根本的に
お気に入りのターミナルを開き、実行
カスタマイズされた11番目の設定なしで動作します.
いくつかのイメージを取得し、それらを配置してみましょう
内部
はいそれが正しい😀 だって
CSS、JS、またはイメージのような資産
自己によって.
クリエイトア
次に書き込みます.
はビルドディレクトリにコピーされます.
サーバーを再起動し、ブラウザに戻ってください
そして、すべてが動作する必要があります.
どんな最適化の前にイメージをするか見ましょう.
devtool内のネットワークタブを開き、
私の場合は
画像サイズ以上
それをより速くするために.
それを使う時間です
チームからレポを見つけることができますhere .
プロジェクトにインストールします.
と呼ばれる機能
カスタム関数を書くことでテンプレートエンジンを拡張します.
我々のケースでは、我々は我々がテンプレートの中で使うことができる新しいショートコードを持っています
執筆
SRC URL、フォーマット、および様々な幅をイメージプラグインに渡します.
それで、我々はよく複数のサイズと各々のイメージのためにフォーマットを持っています. the
私たちはコードにそれを注入することができます.
変数の結果 用途
今、我々は戻って全体に戻るには良いです
オープン
サーバーを再起動し、ブラウザに移動します.そして再びネットワークタブを開きます.
ブーム💥 この時点でロードされたすべての画像
以上のサイズ
これは、使用してコンテンツシフトを避けるために余分なステップです
インライン
JavaScriptがサポートされていないブラウザのフォールバックとして
ネイティブのlazyloadingvanilla-lazyload .
シャープなパッケージをインストールして、ぼやけたインラインBase 64イメージを得ます
また、
変更後の最終コード:
テンプレートエンジン、我々は使用するので
on
ベール🎉, 今、私たちはあなたのサイトに良い探して高速画像を持っている.
今、どのように統合する方法を知っている
あなたがイメージ最適化についてもっと学ぶ必要があるなら、あなたの
チェックするblog 著者によって
Githubの完全な例を見つけることができます
イメージを持つサイトを構築するには、最適化する必要があります
任意のコンテンツのシフトを避けるために、良いユーザーエクスペリエンスを提供します.
それを達成するためには、圧縮、サイズ変更、および画像の形式を変換する必要があります.
この記事では、私たちはあなたのイメージを
静的サイト生成ウェブサイトeleventy-img , and sharp .
開始する基本プロジェクトを作成する
新しいディレクトリを作成し、名前を付けます
11ty-img-example
または何をしたい.その後、実行
yarn init -y
使えますnpm
あなたが好むならば.今すぐインストール
eleventy
, インデックスを作成します.日本鋼管根本的に
html
マークアップ.yarn add -D @11ty/eleventy
touch index.njk
<!-- index.njk -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>11ty img example</title>
</head>
<body>
Hello, World!
</body>
</html>
オープンユアpackage.json
ファイルを追加し、devとbuildスクリプトを追加します.// package.json
"scripts": {
"dev": "eleventy --serve",
"build": "eleventy"
}
ブラウザでプロジェクトを実行する
お気に入りのターミナルを開き、実行
yarn dev
現在オープンlocalhost:8080
あなたのブラウザとカスタマイズされた11番目の設定なしで動作します.
画像を表示
いくつかのイメージを取得し、それらを配置してみましょう
images
ディレクトリ.内部
index.njk
テーマを表示してください.ls images/
518k 0001.jpg
2.6M 0002.jpg
1.7M 0003.jpg
368k 0004.jpg
679k 0005.jpg
556k 0006.jpg
602k 0007.jpg
1.6M 0008.jpg
1.4M 0009.jpg
<!-- index.njk -->
<body>
<img src="/images/0001.jpg" alt="image no 01" />
<img src="/images/0002.jpg" alt="image no 02" />
<!-- ... -->
</body>
ブラウザを開き、任意の画像をレンダリングする必要はありません.はいそれが正しい😀 だって
eleventy
取り扱いませんCSS、JS、またはイメージのような資産
自己によって.
クリエイトア
.eleventy.js
ルートディレクトリ上のファイル次に書き込みます.
module.exports = (cfg) => {
cfg.addPassthroughCopy("images");
}
現在すべての内部images
ディレクトリはビルドディレクトリにコピーされます.
サーバーを再起動し、ブラウザに戻ってください
そして、すべてが動作する必要があります.
最適化のないテスト画像性能
どんな最適化の前にイメージをするか見ましょう.
devtool内のネットワークタブを開き、
fast 3G
ネットワークシミュレーションとして.私の場合は
50s
すべての画像をレンダリングするには画像サイズ以上
2mb
. それで、我々は方法を見つける必要がありますそれをより速くするために.
プラグインの追加
それを使う時間です
eleventy-img
, からのこのプラグインチームからレポを見つけることができますhere .
プロジェクトにインストールします.
yarn add -D @11ty/eleventy-img
オープン.eleventy.js
ファイルを作成し、以前に書いた行を削除し、次のコードを追加します.// .eleventy.js
const Image = require("@11ty/eleventy-img");
module.exports = (cfg) => {
cfg.addNunjucksAsyncShortcode("Image", async (src, alt) => {
if (!alt) {
throw new Error(`Missing \`alt\` on myImage from: ${src}`);
}
let stats = await Image(src, {
widths: [25, 320, 640, 960, 1200, 1800, 2400],
formats: ["jpeg", "webp"],
urlPath: "/images/",
outputDir: "./_site/images/",
});
let lowestSrc = stats["jpeg"][0];
const srcset = Object.keys(stats).reduce(
(acc, format) => ({
...acc,
[format]: stats[format].reduce(
(_acc, curr) => `${_acc} ${curr.srcset} ,`,
""
),
}),
{}
);
const source = `<source type="image/webp" srcset="${srcset["webp"]}" >`;
const img = `<img
loading="lazy"
alt="${alt}"
src="${lowestSrc.url}"
sizes='(min-width: 1024px) 1024px, 100vw'
srcset="${srcset["jpeg"]}"
width="${lowestSrc.width}"
height="${lowestSrc.height}">`;
return `<div class="image-wrapper"><picture> ${source} ${img} </picture></div>`;
});
}
コードを壊しましょうaddNunjucksAsyncShortcode
shortcodes
レットカスタム関数を書くことでテンプレートエンジンを拡張します.
我々のケースでは、我々は我々がテンプレートの中で使うことができる新しいショートコードを持っています
執筆
{% Image "/images/00.jpg", "this is an alt description" %}
stats = new Image(...)
それで、我々はよく複数のサイズと各々のイメージのためにフォーマットを持っています.
const srcset = ...
stats
結果はそのように見えますstats = {
jpeg: [
{
url: '...',
src: '...',
srcset: '...'
}
],
webp: [
...
]
}
すべてのサイズsrcsetを1つだけのsrcset文字列をreduce
ファンクション私たちはコードにそれを注入することができます.
変数の結果
srcset
srcset = {
jpeg: '<srcset>'
webp: '<srcset>'
}
const source = ...
and const img = ...
webp
形式source
メインイメージタイプとしてjpg
フォールバックimg
タグ.今、我々は戻って全体に戻るには良いです
picture
.を使用した後のテスト画像
オープン
index.njk
置換するimg
タグ付き<!-- index.njk -->
<!-- ... -->
{% Image "images/0001.jpg", "image no 01" %}
{% Image "images/0002.jpg", "image no 02" %}
{% Image "images/0003.jpg", "image no 03" %}
{% Image "images/0004.jpg", "image no 04" %}
<!-- ... -->
PS: you have to write image paths include the full path from the root of the project to make it works.
サーバーを再起動し、ブラウザに移動します.そして再びネットワークタブを開きます.
ブーム💥 この時点でロードされたすべての画像
5s
画像なし以上のサイズ
120kb
.遅延読み込みとぼやけ効果を追加
これは、使用してコンテンツシフトを避けるために余分なステップです
インライン
base64
画像と使用のためのプレースホルダとしてのイメージJavaScriptがサポートされていないブラウザのフォールバックとして
ネイティブのlazyloadingvanilla-lazyload .
シャープなパッケージをインストールして、ぼやけたインラインBase 64イメージを得ます
yarn add -D sharp
on .eleventy.js
シャープパッケージをインポートし、以下のコードを追加します.// .eleventy.js
const sharp = require('sharp');
// ...
const placeholder = await sharp(lowestSrc.outputPath)
.resize({ fit: sharp.fit.inside })
.blur()
.toBuffer();
const base64Placeholder = `data:image/png;base64,${placeholder.toString(
"base64"
)}`;
// ...
置換src
, srcset
, and resize
, to data-src
, data-srcset
, and data-resize
.また、
src
属性<img>
へのタグsrc="${base64Placeholder}"
.変更後の最終コード:
const source = `<source type="image/webp" data-srcset="${srcset["webp"]}" >`;
const img = `<img
class="lazy"
alt="${alt}"
src="${base64Placeholder}"
data-src="${lowestSrc.url}"
data-sizes='(min-width: 1024px) 1024px, 100vw'
data-srcset="${srcset["jpeg"]}"
width="${lowestSrc.width}"
height="${lowestSrc.height}">`;
そして、この記事の前に述べたようにテンプレートエンジン、我々は使用するので
script
タグtype="module"
使うvanilla-lazyload
パッケージ.on
index.njk
ボディタグ終了前</body>
このスクリプトを追加します.<script type="module" async>
import Lazyload from "https://cdn.skypack.dev/vanilla-lazyload";
const lazyload = new Lazyload();
</script>
IMGタグのためにこのスタイルを加えてください<style>
img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
}
</style>
Lazyload後のテスト画像
ベール🎉, 今、私たちはあなたのサイトに良い探して高速画像を持っている.
結論
今、どのように統合する方法を知っている
eleventy-img
プラグインとvanilla-lazyload
パッケージあなたがイメージ最適化についてもっと学ぶ必要があるなら、あなたの
チェックするblog 著者によって
vanilla-lazyload
.Githubの完全な例を見つけることができます
22マハード / 第193のイメージ例
これは私のブログ記事の完全な例です
Reference
この問題について(ハウステンボス画像( 11 ty )の最適化方法), 我々は、より多くの情報をここで見つけました https://dev.to/22mahmoud/how-to-optimize-and-lazyload-images-on-eleventy-11ty-206hテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol