Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
React+webpackのビルドを高速化
Search
Masashi Hirano
January 11, 2018
Programming
2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
React+webpackのビルドを高速化
Osaka Mix Leap #4 - React でLTしました。
https://yahoo-osaka.connpass.com/event/75065/
Masashi Hirano
January 11, 2018
More Decks by Masashi Hirano
See All by Masashi Hirano
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
7
4.9k
Protocol Buffers and Connect for Frontend Development
masashi
0
170
You may not need XXX in Node.js
masashi
5
2.1k
OSSとコミュニティを支える
masashi
1
2.2k
英語ができなかった自分達が、グローバルチーム立ち上げに挑戦!?
masashi
1
3.8k
フロントエンド開発のためのセキュリティ入門について
masashi
1
600
フロントエンド開発のためのセキュリティ入門
masashi
50
19k
Node.jsの2022年と未来 / Node.js in 2022 and Future
masashi
1
1.2k
Corepack ~Node.jsに追加されたパッケージマネージャーマネージャー~ / #tng37
masashi
3
13k
Other Decks in Programming
See All in Programming
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
210
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
190
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
110
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
230
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.7k
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
320
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
790
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
370
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
240
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
RailsConf 2023
tenderlove
30
1.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Un-Boring Meetings
codingconduct
0
360
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Faster Mobile Websites
deanohume
310
32k
Test your architecture with Archunit
thirion
1
2.3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
230
Typedesign – Prime Four
hannesfritz
42
3.1k
My Coaching Mixtape
mlcsv
0
180
Transcript
React+webpackのビルドを高速化 Osaka Mix Leap (2018/01/11)平野昌士 / @shisama
{ "about": { "name": "Masashi Hirano", "works": "Weblio, Inc.", "twitter":
"@shisama_", "github": "shisama" } }
この発表の対象者 webpack使ってる方 JSのビルドに時間がかかるとお悩みの方 開発スピードをもっとあげたい方
仕事でReactを使ったSPAを開発して います
webpackを使ってビルドしています
webpackのビルド実行時間 1分もかかります
もっとビルド早くして開発スピードあ げたい
主にwebpackでしていること 複数ファイルを一つにバンドル babelでES2015+やReactを変換 minify
高速化前のwebpack.config module.exports = { // webpack.config.js 一部抜粋 plugins: [ new
webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader', }, ] }, };
ここからビルドの実行を高 速化していきます
高速化に使ったもの cacheDirectory DllPlugin
cacheDirectory
cacheDirectory babel‒loaderのオプション機能 babelの結果をキャッシュする デフォルトではoffになっています
cacheDirectoryの使いかた webpack.config内のbabel‒loaderにクエリを追加する だけ
cacheDirectoryの使いかた module.exports = { // webpack.config.js 一部抜粋 plugins: [ new
webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader?cacheDirectory', // cacheDirectory on }, ] }, };
ビルド実行時間 高速化前: 1分前後 cacheDirectory(初回): 1分前後 cacheDirectory(2回目以降): 40秒~50秒
DllPlugin
DllPlugin webpackのプラグイン 依存PKGだけバンドルしてファイル分割 →reactとかreact‒domとかを別ファイルにまとめる →分割するので、元のバンドルファイルは軽くなる →分割したファイル両方をhtmlで読み込む 依存PKGに変更が無ければDLLバンドルファイルの更 新は不要
DllPluginの使い方 DLLバンドル用のwebpack.configを用意 これまでのwebpack.config側でDLLバンドルの情報を 読み込む 分割したファイルをhtmlで読み込む
DLLバンドル用のwebpack.config const path = require('path'); const webpack = require('webpack'); module.exports
= { entry: { // 依存PKG 配列 指定 vendor: ['react', 'react-dom' /* 依存PKG */], }, output: { path: 'path/to/dist', filename: '[name].dll.js', library: '[name]', }, plugins: [ // DllPlugin manifest.json 吐 new webpack.DllPlugin({ path: 'path/to/dll/[name]-manifest.json'), name: '[name]', }), new webpack.optimize.UglifyJsPlugin(), ], resolve: { modules: [path.resolve(__dirname, 'src'), 'node_modules'], }, };
これまでのwebpack.config module.exports = { // webpack.config.js 一部抜粋 plugins: [ //
Dll 使 new webpack.DllReferencePlugin({ context: __dirname, // DLL manifest.json 指定 manifest: require('path/to/dll/vendor-manifest.json'), }), new webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader?cacheDirectory', // cacheDirectory on }, ] } };
分割したファイルをhtmlで読み込む <!-- DLL 先 読 込 --> <script src="./vendor.dll.js"></script> <!--
元 --> <script src="./index.bundle.js"></script>
ビルド実行時間 高速化前: 1分前後 cacheDirectory(2回目以降): 40~50秒 cacheDirectory+DllPlugin: 20秒前後
その他高速手段 ・happypack ・webpackのキャッシュ ・今回は効果が出ませんでした ・webpack#externals ・指定したPKGをバンドルに含めない ・依存PKGはCDNから取ってくる場合おすすめ ・parcel ・バズったやつ ・Blazing
fast。webpackよりかなりビルド早い ・no config ・webpackほど機能豊富ではない ・minifyが壊れていたりするらしい ・現状では導入は厳しそう
参考 ・ ・ ・ ・ ・ babel‒loader DllPlugin webpackのDLLバンドルを使ってビルドを速くする webpack時代の終わりとparcel時代のはじまり
parcelでバンドルしてみた & そのとき出会ったハマりどころまと め
宣伝
ご清聴ありがとうございました