ãã®èšäºã§ã¯ãWebpack bundlerã䜿çšããBEMãããžã§ã¯ãã®ã¢ã»ã³ããªã«çŠç¹ãåœãŠãŸãã ãªãŒããŒã«äžèŠãªãšã³ãã£ãã£ãããŒãããã«ãæ§æã®äžäŸã瀺ããŸãã
ãã®è³æã¯ãBEMã«ç²Ÿéãå§ããã°ããã®äººã«é©ããŠããŸãã æåã«ãæ¹æ³è«ã®çè«çåŽé¢ã«è§Šãããå®è·µãã®ã»ã¯ã·ã§ã³ã§ãããã®é©ç𿹿³ã瀺ããŸãã
çè«ã®ããã
ãããåããŠBEMã«ã€ããŠè³ã«ããèªåã§ãããç¥ãããå Žåã¯ã ããã¥ã¡ã³ããä¿ç®¡ããŠãã ããã
BEMã¯ãããããèŠæš¡ã®ãããžã§ã¯ããæŽçããããã«äœ¿çšãããæ¹æ³è«ã§ãã Yandexã¯ãããéçºããæåã¯ãµãŒãã¹ã®äœæ¥ã§ã®ã¿äœ¿çšããŠããŸããããåŸã«ãããªãã¯ãã¡ã€ã³ã§å
¬éãããŸããã
BEMã¯ãBlockãElementãModifierãã®ç¥ã§ãã
ãããã¯ã¯ãåå©çšå¯èœãªèªåŸã¢ãŒããã¯ãã£ãæã€ãšã³ãã£ãã£ã§ãã ãããã¯ã«ã¯ç¬èªã®èŠçŽ ãå«ãŸããå ŽåããããŸãã
èŠçŽ ã¯ãããã¯ã®äžå¯æ¬ ãªéšåã§ãã èŠçŽ ã¯ã芪ãããã¯å
ã§ã®ã¿äœ¿çšã§ããŸãã
修食åã¯ããããã¯ã®è¡šç€ºãç¶æ
ããŸãã¯åäœã倿Žãããšã³ãã£ãã£ã§ãã
ãããã®ã³ã³ããŒãã³ãã¯æ¹æ³è«ã®æ ¹åºã«ãããŸãã ãããã¯ãçŸãããšäŸ¿å©ãªã³ãŒãåé¢ãæäŸããŸãã ããã€ã¹ã®è©³çްã«ã€ããŠã¯ã ããã¥ã¡ã³ãã«èšèŒãããŠããŸã ã
BEMã®ããã¥ã¡ã³ãã¯åºç¯å²ã«ããã£ãŠæžãããŠããŸãã ãã ãããå
¥åãã1ã€ãããŸããããã¯ãçŽ æãå
¥åããããã®é«ããããå€ã§ãã ããã¥ã¡ã³ãã®1ããŒãžãèªãããšã§ã¬ã€ã¢ãŠãã®åºæ¬ãçè§£ã§ããå Žåããããžã§ã¯ããçµã¿ç«ãŠãåé¡ã¯ããè€éã«ãªããŸãã
ãããžã§ã¯ããçµã¿ç«ãŠãã®ã¯ãªãã§ããïŒ å€§èŠæš¡ãªãããžã§ã¯ãã«åãçµããšãã誰ããã³ãŒããæŽçããåé¡ã«çŽé¢ããŸãã 倧ããªãããžã§ã¯ãã®ãã¹ãŠã®ã³ãŒãã1ã€ã®ãã¡ã€ã«ã«ä¿åããã®ã¯äžäŸ¿ã§ãã ã³ãŒããããã€ãã®ãã¡ã€ã«ã«åå²ãããããæåã§åéããããšãæåã®æ¹æ³ã§ã¯ãããŸããã ãã®åé¡ã解決ããããã«ãã³ã¬ã¯ã¿ãŒãŸãã¯ãã³ãã©ãŒã䜿çšããŠããããžã§ã¯ãã®ãœãŒã¹ã³ãŒããæ¬çªç°å¢ã«éä¿¡ããæºåãã§ããã³ãŒãã«èªå倿ããŸãã
èªè
ã«åºæ¬çãªWebpackã¹ãã«ãããããšãããã«æ³å®ããŠããŸãã 圌ãšäžç·ã«ä»äºãããããšããªãå Žåã¯ããŸããã®ããŒã«ã«æ
£ããããšããå§ãããŸãã
BEMããã¥ã¡ã³ãã«ã¯ããããžã§ã¯ãã®ã¢ã»ã³ããªã«é¢ããæšå¥šäºé
ãèšèŒãããŠããŸãã äŸãšããŠæäŸãããã®ã¯ãENBãšGulpã䜿çšããã¢ã»ã³ããªã®2ã€ã®ãªãã·ã§ã³ã®ã¿ã§ãã
ENBã¯ãBEMãããžã§ã¯ãã®æ§ç¯å°çšã«èšèšããããŠãŒãã£ãªãã£ã§ãã 圌女ã¯ããã«BEMãšã³ãã£ãã£ãæäœã§ããŸãã ããããã³ãŒããèŠãŠãã ããã äžèŠãããšãåœŒã¯æºåã®ã§ããŠããªãéçºè
ãããæ°ã«ãããããšãã§ããŸãã
ENBèšå®ã³ãŒãã¯ãBEMã䜿ãå§ããã°ããã®äººã«ãšã£ãŠã¯æããã«è€éã§ãã
ãã®ããã¥ã¡ã³ãã«ã¯ãã³ã¬ã¯ã¿ãŒã®æ¢è£œã®èšå®ãå«ãŸããŠãããã¢ã»ã³ããªã®è©³çްã詳ãã調ã¹ãããšãªã䜿çšã§ããŸãã ããããç§ã®ããã«ããã«ãäžã«ãããžã§ã¯ãã§äœãèµ·ãã£ãŠããããå®å
šã«ææ¡ãããå Žåã¯ã©ãã§ããããïŒ
BEMã®ããã¥ã¡ã³ãã§ã¯ãã¢ã»ã³ããªããã»ã¹ã«ã€ããŠçè«çã«èª¬æããŠããŸãããå®éã®äŸã¯ã»ãšãã©ãªããããã»ã¹ãæç¢ºã«çè§£ããã®ã«å¿
ãããé©ããŠãããšã¯éããŸããã ãã®åé¡ã解決ããããã«ãWebpackã䜿çšããŠåºæ¬çãªBEMãããžã§ã¯ããæ§ç¯ããããšããŸãã
ç·Žç¿ãã
ãã®åã«ãã³ãŒãã®åé¢ãšã¢ã»ã³ããªã®ç·šæã«ããããããžã§ã¯ãã®äœæ¥ãç°¡ç¥åããããšè¿°ã¹ãŸããã 以äžã®äŸã§ã¯ãBEMã䜿çšããã³ãŒãåé¢ãšWebpackã䜿çšããã¢ã»ã³ããªãæäŸããŸãã
æãåçŽãªæ§æãååŸãããã®ã§ãã¢ã»ã³ããªããžãã¯ã¯ç·åœ¢ã§çŽæçã§ãªããã°ãªããŸããã CSSãšJSã®2ã€ã®ãã¯ãããžãŒãæã€1ã€ã®BEMãããã¯ã§ããŒãžãçµã¿ç«ãŠãŸãããã
ãblockãã¯ã©ã¹ãæã€1ã€ã®DIVã§HTMLã³ãŒããèšè¿°ãããã®ãã¹ãŠã®ãã¯ãããžãŒãæåã§æ¥ç¶ã§ããŸãã BEMã¯ã©ã¹ã®åœåãšå¯Ÿå¿ãããã¡ã€ã«æ§é ã䜿çšããŠãæ¹æ³è«ã®ååã«éåããŸããã
次ã®ãããžã§ã¯ãããªãŒãååŸããŸããã
âââ desktop
æåã®è¡ã¯ãããã¹ã¯ãããããªãŒããŒã©ã€ãã¬ãã«ã瀺ããŠããŸãã BEMã®çšèªã§ã¯ã åå®çŸ©ã¬ãã«ã¯ãç¬èªã®ãããã¯å®è£
ãå«ããã£ã¬ã¯ããªã§ãã ãããžã§ã¯ããçµã¿ç«ãŠããšããç¹å®ã®é åºã§ãã¹ãŠã®åå®çŸ©ã¬ãã«ããã®å®è£
ãæçµçãªãã³ãã«ã«åé¡ãããŸãã
ããšãã°ããã¹ã¯ãããããã€ã¹ã®ãããã¯å®è£
ãä¿åãããããã¹ã¯ããããã®åå®çŸ©ã¬ãã«ããããŸãã ãããžã§ã¯ããã¢ãã€ã«ããã€ã¹çšã®ã¬ã€ã¢ãŠãã§è£å®ããå¿
èŠãããå Žåã¯ããã¢ãã€ã«ãã®æ°ããã¬ãã«ã®åå®çŸ©ãäœæããåããããã¯ã®æ°ããå®è£
ã§åããã ãã§ååã§ãã ãã®ã¢ãããŒãã®äŸ¿å©ãã¯ãæ°ããã¬ãã«ã®åå®çŸ©ã§ã¯ãããã¹ã¯ããããã«ãã§ã«ååšããã³ãŒããèªåçã«æ¥ç¶ãããããè€è£œããå¿
èŠããªãããšã§ãã
Webpackã®èšå®ã¯æ¬¡ã®ãšããã§ãã
ããã§ããã¡ã€ã«/pages/index.js
ããšã³ããªãã€ã³ããšããŠæå®ããCSSã¹ã¿ã€ã«ã®ããŒããŒã远å ãã /pages/index.html
ã/dist/index.html
ã³ããŒã/dist/index.html
ã
index.html <html> <body> <div class="block">Hello, World!</div> <script src="index.js"></script> </body> </html>
block.css .block { color: red; font-size: 24px; text-align: center; }
block.js document.getElementsByClassName('block')[0].innerHTML += " [This text is added by block.js!]"
ãã®äŸã§ã¯ã1ã€ã®ãªãŒããŒã©ã€ãã¬ãã«ãš1ã€ã®ãããã¯ã䜿çšããŸãã ã¿ã¹ã¯ã¯ããããã¯ã®ãã¯ãããžãŒïŒcssãjsïŒãæ¥ç¶ãããããã«ããŒãžãçµã¿ç«ãŠãããšã§ãã
ãã¯ãããžãŒãæ¥ç¶ããã«ã¯ã require()
ã䜿çšãrequire()
ã
Webpackãèµ·åããŠãäœãèµ·ãããã確èªããŸãã ./dist
ãã©ã«ããŒããindex.html
ãéããŸãã
ããŒãžã®ã¹ã¯ãªãŒã³ã·ã§ãã ãããã¯ã¹ã¿ã€ã«ãèªã¿èŸŒãŸããjavascriptãæ£åžžã«æ©èœããŸããã ããã§ã倧åãªæåãBEMãããããžã§ã¯ãã«æ£ãã远å ã§ããŸãã
ãŸããBEMã¯å€§èŠæš¡ãªãããžã§ã¯ãã§åäœããããã«äœæãããŸããã ãã¶ã€ããŒã詊ãããšãããããŒãžäžã§1ãããã¯ã§ã¯ãªã100ãããã¯ã«ãªã£ããšæ³åããŠãã ããã åã®ã·ããªãªã«åŸã£ãŠã require()
ã䜿çšããŠåãããã¯ã®ãã¯ãããžãŒãæåã§æ¥ç¶ããŸãã ã€ãŸããå°ãªããšã100è¡ã®ã³ãŒããindex.jsã«è¿œå ãããŸãã
åé¿ã§ããäœåãªã³ãŒãè¡ã¯æªãã§ãã æªäœ¿çšã®ã³ãŒãã¯ããã«æªãã§ãã ããŒãžã«äœ¿çšå¯èœãªãããã¯ã10åãã€ãŸã20åããŸãã¯53åãããªãå Žåã¯ã©ããªããŸããïŒ éçºè
ã¯è¿œå ã®äœæ¥ãå¿
èŠã«ãªããŸããããŒãžã§äœ¿çšãããŠãããããã¯ã«æ£ç¢ºã«æ³šç®ããæçµãã³ãã«ã§äžèŠãªã³ãŒããåé¿ããããã«æåã§æ¥ç¶ããã³åæããå¿
èŠããããŸãã
幞ããªããšã«ããã®äœæ¥ã¯Webpackã«å§ããããšãã§ããŸãã
ãã®ããã»ã¹ãèªååããã¢ã¯ã·ã§ã³ã®æé©ãªã¢ã«ãŽãªãºã ïŒ
- æ¢åã®HTMLã³ãŒãããBEMåœåã«å¯Ÿå¿ããã¯ã©ã¹ãæœåºããŸãã
- ã¯ã©ã¹ã«åºã¥ããŠãããŒãžã§äœ¿çšãããŠããBEMãšã³ãã£ãã£ã®ãªã¹ããååŸããŸãã
- åå®çŸ©ã¬ãã«ã§äœ¿çšæžã¿ãããã¯ãèŠçŽ ãããã³ä¿®é£Ÿåã®ãã£ã¬ã¯ããªããããã©ããã確èªããŸãã
- é©åãª
require()
åŒã远å ããŠããããã®ãšã³ãã£ãã£ã®ãã¯ãããžãŒããããžã§ã¯ãã«æ¥ç¶ããŸãã
ãŸãããã®ã¿ã¹ã¯çšã®æ¢è£œã®ããŒãããŒããŒããããã©ããã確èªããããšã«ããŸããã 1ã€ã®ããã«ã§å¿
èŠãªæ©èœããã¹ãŠæäŸããã¢ãžã¥ãŒã«ã¯èŠã€ãããŸããã§ããã ããããBEM宣èšãrequire()
åŒã«å€æããbemdecl-to-fs-loaderã«åºäŒããŸãã ã ãããžã§ã¯ããã¡ã€ã«æ§é ã§å©çšå¯èœãªåå®çŸ©ã¬ãã«ãšãã¯ãããžãŒã«åºã¥ããŠããŸãã
BEMå®£èš -ããŒãžã§äœ¿çšãããBEMãšã³ãã£ãã£ã®ãªã¹ãã ãããã®è©³çްã«ã€ããŠã¯ã ããã¥ã¡ã³ããåç
§ããŠãã ãã ã
1ã€ã®ãªã³ã¯ããããŸãã-HTMLãBEMãšã³ãã£ãã£ã®é
åã«å€æããŸãã ãã®ã¿ã¹ã¯ã¯ã html2bemjsonã¢ãžã¥ãŒã«ã«ãã£ãŠè§£æ±ºãããŸãã
bemjson-å°æ¥ã®ããŒãžã®æ§é ãåæ ããããŒã¿ã éåžžããããã¯bem-xjstãã³ãã¬ãŒããšã³ãžã³ã«ãã£ãŠããŒãžã圢æããããã«äœ¿çšãããŸãã bemjsonã®æ§æã¯å®£èšã®æ§æã«äŒŒãŠããŸããã宣èšã«ã¯äœ¿çšãããŠãããšã³ãã£ãã£ã®ãªã¹ãã®ã¿ãå«ãŸããŠããŸãããbemjsonã¯ãã®é åºãåæ ããŠããŸãã
bemjsonã¯å®£èšã§ã¯ãªãããããŸãbemdecl-to-fs-loaderã«éä¿¡ããããã«decl圢åŒã«å€æããŸãã ãã®ã¿ã¹ã¯ã§ã¯ãSDKã®ã¢ãžã¥ãŒã«bemjson-to-declã䜿çšããŸãã ãããã¯WebpackããŒããŒã§ã¯ãªããéåžžã®NodeJSã¢ãžã¥ãŒã«ã§ãããããã©ãããŒããŒããŒãäœæããå¿
èŠããããŸãã ãã®åŸãããããWebpackã§ã®å€æã«äœ¿çšã§ããããã«ãªããŸãã
次ã®ããŒãããŒããŒã³ãŒããååŸããŸãã
let html2bemjson = require("html2bemjson"); let bemjson2decl = require("bemjson-to-decl"); module.exports = function( content ){ if (content == null && content == "") callback("html2bemdecl requires a valid HTML."); let callback = this.async(); let bemjson = html2bemjson.convert( content ); let decl = bemjson2decl.convert( bemjson ); console.log(decl);
ããŒãããŒããŒã®ã€ã³ã¹ããŒã«ãç°¡çŽ åããå°æ¥ã®æéãç¯çŽããããã«ã NPMã«ã¢ãžã¥ãŒã«ãããŠã³ããŒãããŸããã
ãããžã§ã¯ãã«ããŒãããŒããŒãã€ã³ã¹ããŒã«ããŠãWebpackã®æ§æã倿ŽããŸãããã
const webpack = require('webpack'); const path = require('path'); const opy = require('copy-webpack-plugin'); module.exports = { entry: path.resolve(__dirname, "pages", "index.js"), output: { filename: 'index.js', path: path.join(__dirname, 'dist') }, module: { rules: [ { test: /\.html$/, use: [ {
bemdecl-to-fs-loader
ããŒãããŒããŒlevels
ãã©ã¡ãŒã¿ãŒã¯ã䜿çšãããªãŒããŒã©ã€ãã¬ãã«ãšé åºãæå®ããŸãã extensions
ã¯ããããžã§ã¯ãã§äœ¿çšããããã¡ã€ã«æè¡æ¡åŒµextensions
æäŸããŸãã
ãã®çµæããã¯ãããžãŒãæåã§æ¥ç¶ãã代ããã«ãHTMLãã¡ã€ã«ã®ã¿ãå«ããŸãã å¿
èŠãªå€æã¯ãã¹ãŠèªåçã«å®è¡ãããŸãã
index.jsã®å
å®¹ãæ¬¡ã®è¡ã«çœ®ãæããŸãããã
require('./index.html');
次ã«Webpackãå®è¡ããŸãã çµã¿ç«ãŠããšã次ã®è¡ã衚瀺ãããŸãã
[ BemEntityName { block: 'block' } ]
ããã¯ã宣èšã®åœ¢æãæåããããšãæå³ããŸãã Webpackã®åºåãçŽæ¥ç¢ºèªããŸãã
Entrypoint main = index.js [0] ./pages/index.js 24 bytes {0} [built] [1] ./pages/index.html 74 bytes {0} [built] [2] ./desktop/block/block.css 1.07 KiB {0} [built] [3] ./node_modules/css-loader/dist/cjs.js!./desktop/block/block.css 217 bytes {0} [built] [7] ./desktop/block/block.js 93 bytes {0} [built] + 3 hidden modules
ããŒãžã®ã¹ã¯ãªãŒã³ã·ã§ãã ãã¹ãŠã®ãããã¯ãã¯ãããžãŒãèªåçã«æ¥ç¶ããããšããç¹ã§ãåã®çµæãšåãçµæãåŸãããŸããã ãšãããããBEMãšããååã®ã¯ã©ã¹ãHTMLã«è¿œå ãããã®HTMLãrequire()
æ¥ç¶ããæ¥ç¶ã®ããã®ãã¯ãããžãŒã䜿çšããŠé©åãªãã£ã¬ã¯ããªãäœæããã ãã§ååã§ãã
ãã®ãããBEMææ³ã«å¯Ÿå¿ãããã¡ã€ã«æ§é ãšããããã¯ãã¯ãããžãŒãèªåçã«æ¥ç¶ããã¡ã«ããºã ããããŸãã
æ¹æ³è«ã®ã¡ã«ããºã ãšãšã³ãã£ãã£ããæœè±¡åããéåžžã«ã·ã³ãã«ã ã广çãªWebpackæ§æãäœæããŸããã ãã®äŸããBEMã«ç²ŸéããŠãããã¹ãŠã®äººãBEMãããžã§ã¯ãæ§ç¯ã®åºæ¬ååãããããçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
䟿å©ãªãªã³ã¯