Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
webpackが何故必要で、 何故分かりづらいのか
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
tomof
November 20, 2016
Programming
5.2k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
webpackが何故必要で、 何故分かりづらいのか
tomof
November 20, 2016
More Decks by tomof
See All by tomof
RedwoodJSを試してみた
tomof
0
170
JAMstack_conf_2019 JAMstack at scale Report
tomof
0
140
Other Decks in Programming
See All in Programming
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
36k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
200
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.7k
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
Intent as Code
shoppingjaws
4
670
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
360
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
250
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
490
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
130
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
6
3.3k
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
Heart Work Chapter 1 - Part 1
lfama
PRO
9
36k
Thoughts on Productivity
jonyablonski
76
5.4k
How to build a perfect <img>
jonoalderson
1
6k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Building a Scalable Design System with Sketch
lauravandoore
464
34k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Code Review Best Practice
trishagee
74
20k
Designing for Performance
lara
611
70k
Transcript
webpack͕ԿނඞཁͰɺ Կނ͔ΓͮΒ͍ͷ͔ @tomof 1
࣍ 1. Կނwebpackͳͷ͔ʁ 2. webpackೖ 3. webpackԿނ͜Μͳʹ͔ΓͮΒ͍ͷ͔? 4. ·ͱΊ 2
1. Կނwebpackͳͷ͔ʁ 3
طଘͷπʔϧԿ͕ବͩͬͨͷ͔ʁ 4
5 େنͳϓϩδΣΫτʹ ద͍ͯ͠ͳ͍
զʑɺ1ͭͷڊେͳϑΝΠϧʹ࿈݁͢ΔΑ͏ɺ ڭҭ͞Εͯ͠·ͬͨʂʂ 6
طଘͷπʔϧΛͬͯ ղܾͰ͖ͳ͔ͬͨͷ͔ʁ 7
8 ֦ுΛࢼΈ͕ͨ ্ख͘ߦ͔ͳ͔ͬͨ
webpackͷత • ґଘੑͷ͋ΔπϦʔߏΛɺಡΈࠐΈ࣌ͷඞཁੑʹԠͯ͡ νϟϯΫ(chunk/ݻ·Γ)ຖʹׂ͢Δɻ • ॳճͷಡΈࠐΈ࣌ؒΛ͘͢Δ(อͭ)ɻ • શͯͷ੩తΞηοτΛϞδϡʔϧʹ͢Δ͜ͱ͕ग़དྷΔɻ • େنϓϩδΣΫτʹదͨ͠Έɻ
9
खಈͰղܾͰ͖ͳ͍͔ʁ • ґଘੑͷղܾɺඇಉظಡΈࠐΈ • ؾ͕ڰ͍ͦ͏…ɻ 10
webpackʹҕͶΔࣗಈԽͷઃఆ • ׂͨ͠ϑΝΠϧαΠζ͕খ͗͢͞Δ߹ɺ ׂ͠ͳ͍ͱ͍͏ઃఆ • ը૾αΠζ͕খ͚͞ΕΠϯϥΠϯԽɺ େ͖͚ΕURLͰಡΈࠐΈɻ 11 background-image: url('../img/puppy.jpg');
background-image: url(‘data:image/png;base64, iVB0Rw0…’); size େ size গ
• webpack your bags ͷ Maxime Fabre ࢯ – طଘͷπʔϧͰຬ͍ͯͨ͠͠ɺ࠷ॳʹwebpackͷ֓ཁʹΛ
௨ͨ࣌͠ʹΠϥοͱͯ͠λϒΛดͨ͡ɻ – ࠓશͯΛwebpackʹҕͶͯ͠·͑ͱͳ͍ͬͯΔɻ 12 webpackΛͬͨਓͷײ
2. webpackೖ 13
webpackΛ༻͢Δʹ? 1. webpackΛΠϯετʔϧ 2. webpack.config.jsʹઃఆΛॻ͖ࠐΉ 3. webpack͔Βఏڙ͞ΕΔrequireؔʹΑͬ ͯɺϞδϡʔϧͷಡΈࠐΈΛߦ͏ɻ 4. ϏϧυίϚϯυΛ࣮ߦ
14
webpack.config.js • ࠷ऴతʹ module.exports ʹΦϒδΣΫΛࢦఆ͢Δ 15 module.exports = { entry:
…, output: {…}, module: { loaders: [ … ], }, plugins: […], ɹ… };
webpack.config.js • ΤϯτϦϙΠϯτ = JavaScript࣮ߦͷೖΓޱͱͳΔϑΝΠϧΛࢦఆ 16 module.exports = { entry:
…, output: {…}, module: { loaders: [ … ], }, plugins: […], ɹ… };
webpack.config.js 17 module.exports = { entry: …, output: {…}, module:
{ loaders: [ … ], }, plugins: […], ɹ… }; • ग़ྗϑΝΠϧͷઃఆ
webpack.config.js • ϩʔμʔͷઃఆ 18 module.exports = { entry: …, output:
{…}, module: { loaders: [ … ], }, plugins: […], ɹ… };
webpack.config.js • ϓϥάΠϯͷઃఆ 19 module.exports = { entry: …, output:
{…}, module: { loaders: [ … ], }, plugins: […], ɹ… };
ϏϧυίϚϯυΛ࣮ߦ 20
webpack༻ޠ • νϟϯΫ • ϩʔμʔ • ϓϥάΠϯ • HMR (Hot
Module Replacement) 21
νϟϯΫ 22 1νϟϯΫ=࠷ऴతʹ1ϑΝΠϧʹग़ྗ͞ΕΔͱݶΒͳ͍? (͜͜ͰɺϓϥάΠϯ͕ɺCSSΛൈ͖ग़ͯ͠ผϑΝΠϧʹ) • ίʔυͷݻ·Γ
ϩʔμʔ 23 • Ϟδϡʔϧͱͯ͠ಡΈࠐΊΔΑ͏ʹ͢ΔͨΊͷΈ • loaderͷଞʹpreLoader(લ)ɺpostLoader(ޙ)͕͋Δ – preLoader : ओʹlintܥͷॲཧͰ༻͞ΕΔ
– postLoader : ओʹίʔυΧόϨοδͷॲཧͰ༻͞ΕΔ
ϩʔμʔͷઃఆྫ 24 module: { loaders: [ { test: /\.js/, loader:
'babel', include: __dirname + '/src', }, { test: /\.scss/, loader: 'style!css!sass' }, … ]
ϩʔμʔͷνΣʔϯ 25 • νΣʔϯͰܨ͛Δ͜ͱ͕Մೳɻ ྫ)ɹ'style!css!sass' 1. SassΛCSSʹม 2. CSSΛJavaScriptʹจࣈྻͱͯ͠ಡΈࠐΉ 3.
ಡΈࠐΜͩจࣈྻΛ<style>λάͱͯ͠<head>ʹՃ .sass .css HTML <style> body: {…} header: {…} 1 2 3
ϩʔμʔΛconfigʹઃఆ͢Δ͜ͱͰ… 26 require("!style!css!./style.css"); require("./style.css");
ϓϥάΠϯ͕ߦ͏͜ͱʢ̍ʣ 27 • ϩʔμʔʹΑͬͯग़ྗ͞ΕͨϑΝΠϧʹରͯ͠Կ͔Λ ߦ͏ –ɹѹॖԽ ɾಡԽ –ɹڞ௨͢ΔίʔυΛҰవΊʹͯ͠ผϑΝΠϧʹൈ͖ग़͢ –ɹಛఆͷαΠζʹຬͨͳ͍ϑΝΠϧͷׂΛऔΓΊΔ
28 • ϩʔμʔͷׂ͔Β֎ΕΔ͜ͱΛ୲͏ –ɹग़ྗϑΥϧμΛΫϦʔϯΞοϓ͢Δ –ɹwebpackͷग़ྗ༰ʹ߹ΘͤͯಈతʹHTMLΛੜ͢Δ ϓϥάΠϯ͕ߦ͏͜ͱʢ̎ʣ
HMR 29 • Hot Module Replacement • ΦʔτϦϩʔυϖʔδશମΛ࠶ಡࠐΈ͢Δ͕ɺHMR࠶ಡ ࠐ͢Δ͜ͱແ͘ɺมߋ͞ΕͨՕॴ͚ͩΛಈతʹஔ͢Δɻ •
ྫ͑ɺ͋ΔखॱΛز͔ͭ౿ΜͰදࣔͨ͠μΠΞϩάͷॲ ཧΛมߋͨ͠߹ʹɺͦͷखॱΛ܁Γฦ͢ඞཁ͕ແ͘ͳΔɻ
web-dev-serverͬͯʁ 30 • Expressϕʔεͷ։ൃ༻αʔόʔ • ΦʔτϦϩʔυHMRΛαϙʔτ • /webpack-dev-server/ʹiframeΛ༻ͨ͠ ಛผͳڥΛఏڙ
web-dev-serverΛ༻͢Δʹʁ 1. webpack-dev-serverΛΠϯετʔϧ 2. webpack.config.js·ͨίϚϯυϥΠϯҾʹઃఆ Λࢦఆͯ͠ɺίϚϯυͰαʔόʔΛ্ཱͪ͛Δɻ 3. localhost:8080 ·ͨɺ localhost:8080/webpack-dev-server/
Ͱ֬ೝ (8080σϑΥϧτઃఆͷϙʔτ൪߸) 31
3. webpackԿނ͜Μͳʹ ɹ͔ΓͮΒ͍ͷ͔? 32
33 ͔ΓͮΒ͍ݪҼ • ઃఆͷࢦఆ –ɹઃఆͷΩʔɾͳͲʹҰ؏ੑ͕ແ͍ɻ –ɹϓϥάΠϯͷಈ࡞͕͍͜͠ɻ • υΩϡϝϯτྨ –ɹቕΓͦ͏ͳϙΠϯτ͔ΓͮΒ͍ϙΠϯτΛ ڧௐͨ͠ΓɺԿނͦ͏ͳͷ͔ʁͱ͍ͬͨઆ໌͕
ෆ͍ͯ͠Δɻ
34 entry: ‘./src’, entry: ‘./src/*’, ʁ gulp.src(“./path/to/**/*.js”) ʹ ͍ۙײ͡ʁ webpack.config.jsͷentryύεࢦఆʹቕͬͨ
entry: ‘./src/*’, entry: ‘./src’, 35 ʁ webpack.config.jsͷentryύεࢦఆʹቕͬͨ ҧͬͨ
entry: ‘./src’, entry: ‘./src/index.js’, 36 webpack.config.jsͷentryύεࢦఆʹቕͬͨ
37 webpack.config.jsͷentryύεࢦఆʹቕͬͨ ͦͷҰํͰ… output: { … path: ‘./builds’ … },
outputͷpathͳͲɺϑΥϧμΛࣔ͢ઃఆ͋Δɻ
38 entry: ‘./src’, ࣮”main”ͱ͍͏νϟϯΫ໊͕ࣗಈతʹ͚ΒΕ͍ͯΔɻ output: { filename: '[name]-bundle.js', … },
νϟϯΫ໊ͷ໊͚ͱ༻ํ๏͕આ໌ෆ main-bundle.js
39 entry: { main: './src', vendor: ["jquery", "mustache"], admin: './admin'
}, νϟϯΫ໊ͷ໊͚ͱ༻ํ๏͕આ໌ෆ entry: ‘./src’, νϡʔτϦΞϧͰΑ͘༻͍ΒΕΔྫ͕ͩ… ࣮ફͰ͜ͷΑ͏ʹͳΔͷͰ
40 entry: { main: './src', vendor: ["jquery", "mustache"], admin: './admin'
}, νϟϯΫ໊ͷ໊͚ͱ༻ํ๏͕આ໌ෆ entry: ‘./src’, νϡʔτϦΞϧͰΑ͘༻͍ΒΕΔྫ͕ͩ… ࣮ફͰ͜ͷΑ͏ʹͳΔͷͰ ҙʹࢦఆՄೳͳνϟϯΫ໊
41 • ϩʔμʔͷνΣʔϯɺԿނӈ͔Βࠨͳͷ͔ʁ ϩʔμʔઃఆͷॻ͖ํ ɹ ’style!css!sass’
42 • ͜͏͍͏͜ͱͳͷ͔ʁ ϩʔμʔઃఆͷॻ͖ํ style( css( sass( ) ) )
ͦ͠͏ͳΒɺҰݴॻ͍ͯ͘ΕΕ͍͍ͷʹ…ɻ
ઃఆͷΩʔɾ͕͔ΓͮΒ͍ 43 module: { loaders: [ { test: /\.js/, loader:
'babel', include: __dirname + '/src', }, { test: /\.scss/, loader: 'style!css!sass' }, … ]
ઃఆͷΩʔɾ͕͔ΓͮΒ͍ 44 module: { loaders: [ { test: /\.js/, loader:
'babel', include: __dirname + '/src', }, { test: /\.scss/, loader: 'style!css!sass' }, … ] ͳͥɺtest ͳͷ͔ʁ
ઃఆͷΩʔɾ͕͔ΓͮΒ͍ 45 JavaScriptͷਖ਼نදݱͷtest()ϝιουʹ༝དྷʁ © 2005-2016 Mozilla Developer Network & ߩݙऀ֤ਓ
ϓϥάΠϯ͕͍͠… 46 • ࣮ફͰආ͚ͯ௨Εͳ͍͚Ͳཧղ͕͍͠ϓϥάΠϯ –ɹCommonsChunkPluginɹ(webpackެࣜ) –ɹextract-text-webpack-plugin
CommonsChunkPlugin 47 • ֤νϟϯΫͰڞ௨(ॏෳ)͢ΔϞδϡʔϧΛൈ͖ग़ͯ͠ผ ϑΝΠϧʹ·ͱΊͯ͘ΕΔϓϥάΠϯ • αʔυύʔςΟͷϞδϡʔϧ͚ͩΛ·ͱΊͨ vendor.jsΛ࡞Δͷʹ༻͞ΕΔ͕ɺ͜Ε͕ ඇৗʹ͔ΓͮΒ͔ͬͨɻ
CommonsChunkPlugin 48 • ͪͳΈʹɺ͜ͷϓϥάΠϯΛ༻͠ͳ͍ͱ… webpack࠷ݶͷ࠷దԽ͔͠ߦΘͳ͍ͨΊɺ
CommonsChunkPlugin 49 • ڞ௨ͯ͠༻͞ΕΔϥΠϒϥϦϞδϡʔϧ͕ ෳͷνϟϯΫͰಡΈࠐ·Εͯ͠·͏ɻ
CommonsChunkPlugin 50 Ծʹɺ͜ΜͳΤϯτϦʔϙΠϯτ͕͋ͬͨͱͯ͠ɺ entry: { pageA: "./pageA", pageB: "./pageB", pageC:
"./pageC", adminPageA: "./adminPageA", adminPageB: "./adminPageB", adminPageC: "./adminPageC", }, ࣍ͷΑ͏ͳCommonsChunkPluginࢦఆ͕ ͋ͬͨͱ͢Δͱɺ
CommonsChunkPlugin 51 var webpack = require('webpack'); … plugins: [ …
new webpack.optimize.CommonsChunkPlugin({ name: "admin-commons", chunks: ["adminPageA", "adminPageB"] }), new webpack.optimize.CommonsChunkPlugin({ name: "commons", chunks: ["pageA", "pageB", "admin-commons"], minChunks: 2 }), new webpack.optimize.CommonsChunkPlugin({ name: "c-commons", chunks: ["pageC", "adminPageC"] }), ],
CommonsChunkPlugin 52 var webpack = require('webpack'); … plugins: [ …
new webpack.optimize.CommonsChunkPlugin({ name: "admin-commons", chunks: ["adminPageA", "adminPageB"] }), new webpack.optimize.CommonsChunkPlugin({ name: "commons", chunks: ["pageA", "pageB", "admin-commons"], minChunks: 2 }), new webpack.optimize.CommonsChunkPlugin({ name: "c-commons", chunks: ["pageC", "adminPageC"] }), ],
CommonsChunkPlugin 53 adminPageA adminUkl adminAcontroller projectUkl adminPageB adminUkl adminBcontroller projectUkl
CommonsChunkPlugin 54 admin-commons adminUkl projectUkl adminPageA adminAcontroller adminPageB adminBcontroller
CommonsChunkPlugin 55 var webpack = require('webpack'); … plugins: [ …
new webpack.optimize.CommonsChunkPlugin({ name: "admin-commons", chunks: ["adminPageA", "adminPageB"] }), new webpack.optimize.CommonsChunkPlugin({ name: "commons", chunks: ["pageA", "pageB", "admin-commons"], minChunks: 2 }), new webpack.optimize.CommonsChunkPlugin({ name: "c-commons", chunks: ["pageC", "adminPageC"] }), ],
CommonsChunkPlugin 56 admin-commons adminUkl projectUkl pageA projectUkl pageAcontroller pageB projectUkl
pageBcontroller
CommonsChunkPlugin 57 admin-commons adminUkl pageA pageAcontroller pageB pageBcontroller commons projectUkl
CommonsChunkPluginͷओͳΦϓγϣϯ • nameɿڞ௨νϟϯΫͷ໊લ ͪͳΈʹnamesଘࡏ͢Δ(ྻΛࢦఆ) • chunksɿରͱ͢ΔνϟϯΫ ʢলུ͢ΔͱɺશͯͷνϟϯΫ͕ରʂ) • minChunksɿ͜ͷͷνϟϯΫͰ༻͞Ε͍ͯͨΒର
(2ճʙνϟϯΫ or Infinity or ؔ) 58
αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ 59 vendor
60 <script src="builds/vendor.js"></script> <script src=“builds/app.js"></script> vendor.jsʹɺ७ਮʹ3rdύʔςΟͷίʔυ͕ ࿈݁͞Εͨͷ͚ͩΛؚΊ͍ͨɻ αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠
61 αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ entry: { main: './src', vendor: ["jquery", "moment", "underscore"],
admin: './admin' },
62 αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ entry: { main: './src', vendor: ["jquery", "moment", "underscore"],
admin: './admin' },
63 αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ plugins: [ … new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename:
'vendor.js', minChunks: Infinity, }), … ]
64 αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ plugins: [ … new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename:
'vendor.js', minChunks: Infinity, }), … ] Infinity !?
65 vendor CommonsChunkPlugin Infinity vendorҎ֎ͷϞδϡʔϧ vendorҎ֎ͷϞδϡʔϧ vendorҎ֎ͷϞδϡʔϧ
66 αʔυύʔςΟϥΠϒϥϦ͚ͩΛ͍ͨ͠ plugins: [ … new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename:
'vendor.js', minChunks: Infinity, }), … ] chunks͕লུ͞Ε͍ͯΔͷͰɺ શͯͷνϟϯΫ͕ରͰ͋Δ͜ͱʹҙʂ chunks: …,
CommonsChunkPlugin 67 app app appController pageA pageAcontroller admin adminController admin
શͯͷνϟϯΫ͔Β
CommonsChunkPlugin 68 app app appController pageA pageAcontroller admin adminController admin
vendor νϟϯΫͷ ϞδϡʔϧΛ(࣮࣭)ൈ͖ग़͚ͩ͢(?)
69 extract-text-webpack-plugin • ࠷ऴతͳόϯυϧ͔Βಛఆͷछྨͷ ίϯςϯπΛूΊɺ ଞͷͷͱύΠϓ͢Δɻ • ΄ͱΜͲ͕ɺCSSͷͨΊʹ༻͞ΕΔɻ • ϖʔδͷॳظදࣔ࣌ʹɺCSS͕ಈతʹಡΈࠐ·ΕΔ͜ͱ
ʹΑͬͯى͖Δνϥ͖ͭͷࢭɻ
70 extract-text-webpack-plugin var ExtractPlugin = require('extract-text-webpack-plugin'); var plugins = [
… new ExtractPlugin(‘bundle.css'), … ];
71 extract-text-webpack-plugin module: { loaders: [ … { test: /\.scss/,
loader: ExtractPlugin.extract('style', 'css!sass'), }, … ], },
72 extract-text-webpack-plugin module: { loaders: [ … { test: /\.scss/,
loader: ExtractPlugin.extract('style', 'css!sass'), }, … ], }, ൈ͖ग़͢͜ͱ͕Մೳͳ߹ʹ ߦ͏͜ͱ ൈ͖ग़͢͜ͱ͕ ग़དྷͳ͔ͬͨ߹ʹ ՃͰߦ͏͜ͱ
4. ·ͱΊ 73
νϡʔτϦΞϧϒϩάهࣄʹҙ • ͜ΕΒʹԊͬͯࢼ͚ͩ͢Ͱɺటপʹ·Δɻ • େࣄͳઆ໌ิ͕ল͔Ε͍ͯΔ͜ͱ͕ଟ͍ɻ 74
ެࣜυΩϡϝϯτΛಡΈղ͘ 75
ެࣜυΩϡϝϯτΛಡΈղ͘ 76 ίϝϯτΛؚΊ…ʢٽʣ
webpack2 / ৽υΩϡϝϯταΠτ 77
͝ਗ਼ௌɺ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ 78