{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/nodejs-is-now-supported-brotli-compression/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"64e5d54e-ef93-50be-a1b3-31dced3d6ac2","excerpt":"以下の PR により、Node.js に Brotli 圧縮がサポートされました。 — zlib: add Brotli support by addaleax · Pull Request #24938 · nodejs/node まだ master に入ったばかり（2019/01/06 マージ）なので 201…","html":"<p>以下の PR により、Node.js に Brotli 圧縮がサポートされました。</p>\n<blockquote>\n<p>— <a href=\"https://github.com/nodejs/node/pull/24938\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">zlib: add Brotli support by addaleax · Pull Request #24938 · nodejs/node</a></p>\n</blockquote>\n<p><del>まだ master に入ったばかり（2019/01/06 マージ）なので 2019/01/08 現在リリースはされていませんが、手元でビルドすれば試せるようになります。</del><br>\n2019/01/20: 11.7.0 でリリースされました。<a href=\"https://nodejs.org/en/blog/release/v11.7.0/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">リリースノート</a></p>\n<h2 id=\"brotli-とは\" style=\"position:relative;\"><a href=\"#brotli-%E3%81%A8%E3%81%AF\" aria-label=\"brotli とは permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Brotli とは</h2>\n<p>Brotli とは、Google が作成した新しいデータ圧縮/解凍アルゴリズムの一種です。<br>\ngzip(Zopfli)と比較して高い圧縮率と圧縮/解凍のパフォーマンスが特徴です。HTML や JavaScript などと相性の良い辞書が用いられており、web 関連のリソースにおいてより高い圧縮率を発揮します。圧縮・解凍のパフォーマンスもよく、gzip に変わる新しい圧縮形式として注目されています。\nIE を除くメジャーなブラウザですでにサポートされており、現時点で Brotli でコンテンツを配信している web サービス、web サイトも多いことでしょう。</p>\n<p>Brotli 自体については以下の記事がとても参考になりました。</p>\n<blockquote>\n<p>— <a href=\"https://blog.redbox.ne.jp/cdn_brotli.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">WEB スピード向上・転送量削減する Brotli 圧縮と CDN の連携 | REDBOX Labo</a><br>\n— <a href=\"https://blog.jxck.io/entries/2017-08-19/content-encoding-brotli.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Brotli を用いた静的コンテンツ配信最適化と Accept-Encoding: br について | blog.jxck.io</a></p>\n</blockquote>\n<p>なお当ブログでも.br（Brotli の拡張子）と.gz の静的ファイルを配布しています。</p>\n<h2 id=\"背景\" style=\"position:relative;\"><a href=\"#%E8%83%8C%E6%99%AF\" aria-label=\"背景 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>背景</h2>\n<p>Brotli に関しての議論は以下の Issue から確認できます。</p>\n<blockquote>\n<p>— <a href=\"https://github.com/nodejs/node/issues/18964\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Feature Idea: Brotli support in core · Issue #18964 · nodejs/node</a></p>\n</blockquote>\n<p>TLDR;<br>\nIE 以外のほぼすべてのモダンブラウザが Brotli 形式のリクエストをサポートしたので、コアに入れようという話です。</p>\n<h2 id=\"これまでの-brotli-の利用方法\" style=\"position:relative;\"><a href=\"#%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AE-brotli-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95\" aria-label=\"これまでの brotli の利用方法 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>これまでの Brotli の利用方法</h2>\n<p>これまでは Brotli 圧縮を利用するために、主に２つの npm パッケージがよく使われていました。<br>\n<a href=\"https://github.com/google/brotli\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">google/brotli</a>にて提供されている C++のコードを gyp でビルドする<a href=\"https://www.npmjs.com/package/iltorb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">iltorb</a>と、Emscripten でラップした<a href=\"https://www.npmjs.com/package/brotli\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">brotli</a>の２つです。<br>\nDL 数の変遷はこちら。</p>\n<blockquote>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 52.69461077844312%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'210\\'%20viewBox=\\'0%200%20400%20210\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M31%2018h-3v7c0%205%201%207%202%207%202%200%202-1%202-2%200-2%201-3%203-3%203%200%204-1%204-4%200-5-2-6-8-5m9%204c0%204%200%205%202%205s2-1%202-3l1-3c1-1%202%201%202%204s3%202%203-1c0-2%201-3%202-3l1%203c0%205%203%204%203-1v-4l-8-1h-8v4\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d471941287f6915bc671919e6c3772f2/5251b/npm-brotli.webp 167w,\n/static/d471941287f6915bc671919e6c3772f2/7390e/npm-brotli.webp 334w,\n/static/d471941287f6915bc671919e6c3772f2/7c056/npm-brotli.webp 668w,\n/static/d471941287f6915bc671919e6c3772f2/0a92e/npm-brotli.webp 1002w,\n/static/d471941287f6915bc671919e6c3772f2/92f8c/npm-brotli.webp 1200w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d471941287f6915bc671919e6c3772f2/21521/npm-brotli.png 167w,\n/static/d471941287f6915bc671919e6c3772f2/86d36/npm-brotli.png 334w,\n/static/d471941287f6915bc671919e6c3772f2/74866/npm-brotli.png 668w,\n/static/d471941287f6915bc671919e6c3772f2/d69c4/npm-brotli.png 1002w,\n/static/d471941287f6915bc671919e6c3772f2/c1b63/npm-brotli.png 1200w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d471941287f6915bc671919e6c3772f2/74866/npm-brotli.png\"\n            alt=\"npm brotli\"\n            title=\"npm brotli\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n    </span><br>\n<a href=\"https://npmcharts.com/compare/iltorb,brotli\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://npmcharts.com/compare/iltorb,brotli</a></p>\n</blockquote>\n<p>Google 公式の C++をそのまま Node.js で動くよう port にした iltorb が流行ったあとに、gyp 不要でお手軽な brotli が徐々に人気を獲得していったように見えます。DL 数が乱高下しているところはなにがあったんでしょう。。。</p>\n<p>なお当ブログは Brotli 圧縮のために<a href=\"https://github.com/ovhemert/gatsby-plugin-brotli\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gatsby-plugin-brotli</a>を利用しています。このプラグインは内部で brotli の方を利用していました。</p>\n<h2 id=\"これからの-brotli-の利用方法\" style=\"position:relative;\"><a href=\"#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE-brotli-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95\" aria-label=\"これからの brotli の利用方法 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>これからの Brotli の利用方法</h2>\n<p>Brotli サポートがリリースされれば、npm パッケージには不要になり、Node.js の<code>zlib</code>モジュールから Brotli が利用できるようになります。<br>\n使い方は<a href=\"https://github.com/nodejs/node/pull/24938/files?short_path=c245d87#diff-c245d87dba893de0b77c7574f0081633\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PR 内のドキュメントの差分</a>を見るのがわかりやすいです。HTTP サーバでどのように Brotli のリクエストを扱えばいいかのデモコードなどがあります。</p>\n<p>例えば文字列を Brotli で圧縮して解凍するプログラムは次ようになります。<br>\nなお、この記事を作成した時点ではまだリリースされてないので、試すには master ブランチでビルドした最新版の Node.js が必要になります。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>\n  brotliCompress<span class=\"token punctuation\">,</span>\n  brotliCompressSync<span class=\"token punctuation\">,</span>\n  brotliDecompress<span class=\"token punctuation\">,</span>\n  brotliDecompressSync<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'zlib'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> promisify <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'util'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> text <span class=\"token operator\">=</span> <span class=\"token string\">'Hello world'</span>\n\n<span class=\"token comment\">// Promise</span>\n<span class=\"token punctuation\">;</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> brotliCompressAsync <span class=\"token operator\">=</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>brotliCompress<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> brotliDecompressAsync <span class=\"token operator\">=</span> <span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>brotliDecompress<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> compressed <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">brotliCompressAsync</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> decodedBuffer <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">brotliDecompressAsync</span><span class=\"token punctuation\">(</span>compressed<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> decodedText <span class=\"token operator\">=</span> decodedBuffer<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>decodedText<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => Hello world</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>decodedText <span class=\"token operator\">===</span> text<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// Sync</span>\n<span class=\"token keyword\">const</span> compressed <span class=\"token operator\">=</span> <span class=\"token function\">brotliCompressSync</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> decodedBuffer <span class=\"token operator\">=</span> <span class=\"token function\">brotliDecompressSync</span><span class=\"token punctuation\">(</span>compressed<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> decodedText <span class=\"token operator\">=</span> decodedBuffer<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>decodedText<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => Hello world</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>decodedText <span class=\"token operator\">===</span> text<span class=\"token punctuation\">)</span> <span class=\"token comment\">// => true</span></code></pre></div>\n<p><code>brotliCompress</code>, <code>brotliCompressSync</code>が圧縮、<code>brotliDecompress</code>, <code>brotliDecompressSync</code>が解凍用の関数です。<br>\n圧縮および解凍には、<code>String</code>, <code>Buffer</code>, <code>ArrayBuffer</code>などを渡せます。</p>\n<p>圧縮率などのオプションを変更するには zlib.constants の中にある定数たちを使います。詳しくはドキュメントを参照してください。<br>\n圧縮率は<code>BROTLI_MIN_QUALITY</code>から<code>BROTLI_MAX_QUALITY</code>の間の整数値が指定できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> constants<span class=\"token punctuation\">,</span> brotliCompressSync <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'zlib'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> <span class=\"token constant\">BROTLI_PARAM_QUALITY</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">BROTLI_MAX_QUALITY</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> constants\n\n<span class=\"token keyword\">const</span> text <span class=\"token operator\">=</span> <span class=\"token string\">'Hello world'</span>\n<span class=\"token keyword\">const</span> maxCompressed <span class=\"token operator\">=</span> <span class=\"token function\">brotliCompressSync</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  params<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">[</span><span class=\"token constant\">BROTLI_PARAM_QUALITY</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">BROTLI_MAX_QUALITY</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>stream を利用したサンプルはこんな感じです。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> createBrotliCompress <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'zlib'</span><span class=\"token punctuation\">)</span>\n\nfs<span class=\"token punctuation\">.</span><span class=\"token function\">createReadStream</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./test.txt'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">createBrotliCompress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span>fs<span class=\"token punctuation\">.</span><span class=\"token function\">createWriteStream</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./test.txt.br'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> createBrotliDecompress <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'zlib'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> pipeline <span class=\"token operator\">=</span> fs\n  <span class=\"token punctuation\">.</span><span class=\"token function\">createReadStream</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./test.txt.br'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">createBrotliDecompress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">;</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> text <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n  <span class=\"token keyword\">for</span> <span class=\"token keyword\">await</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> chunk <span class=\"token keyword\">of</span> pipeline<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    text <span class=\"token operator\">+=</span> chunk\n  <span class=\"token punctuation\">}</span>\n\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>web とのシナジーが高い Brotli ですが、実際のところ.br ファイルを配信するには Apache や nginx・h2o などのレイヤで処理させたり CDN 側に移譲したりすることが多いと思います。仮に実装するとしても express のミドルウェア（や何かしらの npm パッケージ）を使うことがほとんどで、zlib を用いて自前で Node.js レイヤで圧縮プログラムを書く機会はそう多くないと思います。そういったサービスやライブラリの中身が npm モジュールではなく zlib モジュールにおきかわるだけで、実質的な恩恵/影響を受けることは少ないかもしれません。</p>\n<p>ちなみに私は CLI ツールや書き捨ての変換スクリプトを書くときに.gz を読み書きするために結構使ってます。これからは gzip じゃなくても問題ない場合は積極的に Brotli を使っていこうと思います。</p>\n<p>多くのユースケースにおいて直接的な恩恵は少ないかもしれませんが、Brotli とは何か、素の Node.js だけで Brotli 圧縮/解凍できるようになったことを頭の片隅に入れておき、使いどころが来たらここぞとばかりに使うといいかなと思います。</p>","timeToRead":6,"frontmatter":{"title":"Node.jsの11.7.0からzlibモジュールでBrotli圧縮が使えるようになりました","tags":["Node.js"],"date":"January 08, 2019","featuredImage":null}}},"pageContext":{"slug":"/nodejs-is-now-supported-brotli-compression/","previous":{"fields":{"slug":"/impression-comparison-of-middleman-and-gatsby/"},"frontmatter":{"title":"ブログをMiddlemanからGatsbyに乗り換えた雑感","tags":["JavaScript","Gatsby","Middleman"]}},"next":{"fields":{"slug":"/gatsby-remark-discoverable-oembed/"},"frontmatter":{"title":"Gatsbyの記事にoEmbed準拠のコンテンツを埋め込めるようにした","tags":["JavaScript","Gatsby","oEmbed","AST","remark"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}