ããã«ã¡ã¯ãã¡ããã¢ã§ã¨ã³ã¸ãã¢ããã¦ããæä¸(pipopotamasu · GitHub)ã§ãã æ®æ®µã¯Railsã触ã£ã¦ãã¾ãããæã ããã³ãã¨ã³ãå¨ãã®éçºããã¦ãã¾ãã ä»åã¯ã¡ããã¢ã®ç°å¢ã«ãããWebpackerå°å ¥ã¨ããã³ãã¨ã³ãå¨ãã®æ¹åããã¼ãã«è¨äºãæ¸ãã¾ãã
ç®æ¬¡
- ãªãWebpacker(Webpack)ãå°å ¥ããã®ã?
- ããã³ãã¨ã³ãæ¹åè¨ç»
- Webpackerã®å°å ¥ã§æ°ãã¤ãããã¨
ãªãWebpacker(Webpack)ãå°å ¥ããã®ã?
Webpackerãå°å ¥ããèæ¯ã¨ãã¦ã主ã«2ã¤ã®èª²é¡ãããã¾ããã
JavaScriptã®ãã«ãæéãé·ã
ããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ç®¡çãã§ããªã
JavaScriptã®ãã«ãæéãé·ã
å ã ã¡ããã¢ã®ããã³ãã¨ã³ãéçºã«ããã¦Browserifyã¨ããbundlerã使ç¨ãã¦ãã¾ããã ããããããã«ã¯ãã«ãæéãé·ãã¨ããå¼±ç¹ãããã¾ãã ç¹ã«ä»¥ä¸ã®2ã¤ã®å ´é¢ã§ãã®é·ããç®ã«ã¤ãã¾ãã
CI, ãããã¤, ç°å¢æ§ç¯æã«èµ°ã
assets:precompile
ã®ãã«ãéçºæã®JavaScriptã®ãã«ã
ç¾ç¶ã ã¨åè
ã¯ãã«ãã ãã§10åè¿ãããã£ã¦ãã¾ã(JavaScriptã ãã§ãªãcssãªã©ã®ä»ã®ã¢ã»ããã®ãã«ããæéããããã¨ããçç±ãããã¾ãã)ã
å¾è
ã¯Browserifyã¨ä¸ç·ã«ä½¿ã£ã¦ããbabel-plugin-transform-runtime
ã®å®è¡ã«æéãããããJavaScriptã®éçºä¸ã¯3ç§ã»ã©ã®æéããããã¾ãã
ä¾åããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ç®¡çãã§ããªã
ã¡ããã¢ã®ç°å¢ã®npmã®ãã¼ã¸ã§ã³ã3ç³»ã§ãããããããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ãåºå®ããpackage-lock.json(npm5ç³»ããç»å ´)ãããã¾ããã ãã®ãããRailsã®Gemfile.lockã®ããã«ä¾åããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ã管çã§ããªãã¨ããåé¡ãããã¾ãã
ããã2ã¤ã®èª²é¡ã¯Webpackerãå°å
¥ãããã¨ã§ä¸æ°ã«è§£æ±ºããã¾ãã
JavaScriptã®ãã«ãæéãé·ã â ãã«ãæéã®ç縮
BrowserifyããWebpackã®æ¹ããã«ããæ©ããªããã¨ã®ãã³ããã¼ã¯ã¯ã以ä¸ã®è¨äºãåèã«ããã¦ããã ãã¾ããã
Browserifyã¨ã®æ¯è¼ãã¨ã¦ãããããããæ²è¼ããã¦ãã¾ãã å¯ä¸ãå ¨ãã®0ããã®ãã«ã(Fresh build)ãBrowserifyãé度çã«ä¸åã£ã¦ãã¾ããããã®ãããªãã«ããããã®ã¯ååã®ç°å¢æ§ç¯æããããªã®ã§ã»ã¨ãã©æ°ã«ããå¿ è¦ã¯ãªãã§ãããã
ä¾åããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ç®¡çãã§ããªã â yarnã«ãããã¼ã¸ã§ã³ç®¡çå¯è½ã«
Webpackerå°å ¥ã«ãã(ã¨ããããWebpackerãä¾åããyarnã¨ããããã±ã¼ã¸ç®¡çã·ã¹ãã ã«ãã)ãä¸è¨ã®package-lock.json, Gemfile.lockã®ããã«yarn.lockã§ä¾åããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ç®¡çãã§ããããã«ãªãã¾ãã
ä»ã«ãJavaScript以å¤ã®ã¢ã»ãããã¡ã¤ã«ã®ãã«ããã§ãããã¨ã³ã·ã¹ãã ãå å®ãã¦ããã¨ããç¹ã¯BrowserifyããWebpackã¸ã®ä¹ãæãã§å¤§ããªå©ç¹ã§ãããã¾ãã
ãã®ãããªèæ¯ããã¡ããã¢ã§ã¯Webpackerãå°å ¥ãããã¨ã¨ãªãã¾ããã
ããã³ãã¨ã³ãæ¹åè¨ç»
ãããããããªãå
¨ã¦ã®ãã«ããBrowserifyããWebpackerã«ç½®ãæããã¨ãããã¨ã¯ã§ãã¾ããã
ä»ã¾ã§æ¸ãã¦ããJavaScriptã®ã³ã¼ãéãå¤ãããããããWebpackerç¨ã®é å(app/javascripts
)ã«ç§»ãæ¿ããã®ã«ãã¹ããå«ãæéããããããã§ãã
ã¾ããã£ããç§»è¡ãããªããåæã«ããã³ãã¨ã³ãããã£ã¨æ¹åãã¦ãããã£ã³ã¹ã§ãããã¾ãã
å
·ä½çãªæ¹åç¹ã¨ãã¦ã¯...
CommonJSã ã£ãé¨åãES Modulesã«ç½®ãæãã
Vue.jsã§ãã¼ã¿ãã¤ã³ãã£ã³ã°ã®ã¿ã§ãã使ç¨ãã¦ããªãã£ãã¨ããããåä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ããæ´»ç¨ãã
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®Lintãå°å ¥ãã
ææ°çããã±ã¼ã¸ã¸ç¶ç¶çãªUpdateä½å¶ã®ç¢ºç«
ãªã©ãããã¾ãã ããã§ãããããã®æ¹åç¹ã®è©³ç´°ãªãã¤ã³ãã«ã¤ãã¦ã¿ã¦ããã¾ãããã
CommonJSã ã£ãé¨åãES Modulesã«ç½®ãæãã
ES Modules(以ä¸esm)ã«ç½®ãæããã¡ãªããã¨ãã¦ã¯å人çã«ã¯å¤§ãã以ä¸2ã¤ã ã¨æãã¾ãã
å®è¡åã«ã¢ã¸ã¥ã¼ã«èªã¿è¾¼ã¿ã®ã¨ã©ã¼ãæ¤ç¥ã§ãã
ãã¼ã«ã使ããã¨ã§ã³ã¼ãã®æé©åãã§ããããã«ãªã
å®è¡åã«ã¢ã¸ã¥ã¼ã«èªã¿è¾¼ã¿ã®ã¨ã©ã¼ãæ¤ç¥ã§ãã
esmã¯CommonJSã¨éãéçæ§æã§ãããããã³ã¼ãã®å®è¡åã«æ§æè§£æãèµ°ãã¾ãã ããã«ãããéçºè ã¯ããæ©ãæ®µéã§ééãã«æ°ã¥ããã¨ãã§ãã¾ãã
# CommonJS ## module.js function hoge() { return 1 + 1; } exports.module = hoge; ## main.js const fuga = require('./module').fuga console.log(fuga); // undefined
# esm ## module.js export function hoge() { return 1 + 1; } ## main.js import { fuga } from '.module' // <= ããã§Syntax Errorãçºç
ãã¼ã«ã使ããã¨ã§ã³ã¼ãã®æé©åãã§ããããã«ãªã
esmã使ããã¨ã§ãã³ã¼ãã®æé©åãã§ããããã«ãªãã¾ãã ä¾ãã°Webpackã«ã¯Tree Shakingã¨ããæ©è½ãããã¾ãã ESã¢ã¸ã¥ã¼ã«å½¢å¼ã§æ¸ãããã³ã¼ããbundleãã¦ä¸ã¤ã®ãã¡ã¤ã«ã«ããæã«ãexportãã¦ãããã©ã©ããããimportããã¦ããªãã使ããã¦ããªãã³ã¼ããåé¤ããæ©è½ã®ãã¨ã§ãã
https://webpack.js.org/guides/tree-shaking/
Edgeã§ãexport/importæã«ã³ã¼ãã®æé©åããããããã§ãã
ã¾ãCommonJSã¯ãããããµã¼ããã¼ãã£ãªã®ã«å¯¾ããesmã¯ECMAScriptã§å®ç¾©ãããJavaScriptã®æ¨æºã§ããã¨ãããã¨ãç½®ãæãã®çç±ã§ãã
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®æ´»ç¨
ã¡ããã¢ã§ã¯JavaScriptã®ãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦Vue.jsã使ç¨ãã¦ãã¾ããVue.jsã®æ©è½ã¨ãã¦ãVue.jsãé©ç¨ããããã³ãã¬ã¼ã(HTML)ã¨JavaScriptãåããã¡ã¤ã«å ã«è¨è¿°ããåä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã¨ãããã®ãããã¾ãã åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã使ç¨ããã¡ãªããã¯ããã¤ãããã¾ãããæã大ããªçç±ã¯å¯èªæ§ã®åä¸ã§ãã å¯èªæ§ã®åä¸ã«ã¤ãã¦ã¯3ã¤ã®ãã¤ã³ããããã¾ãã
ã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ã
åä¸ãã¡ã¤ã«å ã«ãã³ãã¬ã¼ãã¨ãã³ãã¬ã¼ãã«é©ç¨ããJavaScriptãæ¸ããã¨ãã§ãã
ãã³ãã¬ã¼ãå ã§ES6ã使ç¨ã§ãã
ã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ã
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã使ç¨ããªãå ´åãHTMLãã¡ã¤ã«å ã«Vue.jsã®ã³ã¼ããæ¸ãå¿ è¦ãããã¾ãã ã¡ããã¢ã§ã¯Viewãã³ãã¬ã¼ãã«Hamlãæ¡ç¨ãã¦ãããããHamlãã¡ã¤ã«å ã«Vue.jsã®ã³ã¼ããæ¸ãã¦ãã¾ãã ããããHamlãã¡ã¤ã«å ã«Vue.jsã®ã³ã¼ããæ¸ãã¦ãã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ããHamlã®ã³ã¼ãã«ããé©ç¨ãããªãããé常ã«è¦è¾ãã§ãã
[åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®ãã³ãã¬ã¼ã]
[Hamlå
ã«æ¸ãããã³ãã¬ã¼ã]
ä¸ã®ããã«ãåä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãå ã®ãã³ãã¬ã¼ãã¯è¦ããããã¤ã©ã¤ããã(â»ã使ãã®ã¨ãã£ã¿ã§ãã¤ã©ã¤ãã®ãã©ã°ã¤ã³ãå ¥ããå¿ è¦ãããã¾ã)ã䏿¹Hamlå ã«æ¸ãããã³ãã¬ã¼ãã¯Hamlã®ã·ã³ã¿ãã¯ã¹ãããã¤ã©ã¤ããããªãããè¦ã¥ãããªã£ã¦ãã¾ãã¾ãã
åä¸ãã¡ã¤ã«å ã«ãã³ãã¬ã¼ãã¨ãã³ãã¬ã¼ãã«é©ç¨ããJavaScriptãæ¸ããã¨ãã§ãã
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®æå¤§ã®ç¹å¾´ã§ãã 1ãã¡ã¤ã«å ã«HTML, JavaScript(CSSã)ãè¨è¿°ã§ããã®ã§ã©ã®JavaScriptãã©ã®HTMLã«é©ç¨ããã¦ãããã容æã«ç¥ããã¨ãã§ãã¾ãã
ãã³ãã¬ã¼ãå ã§ES6ã使ç¨ã§ãã
Hamlãã¡ã¤ã«å ã§ã¯ES6ã®JavaScriptã®ã³ã¼ãããã©ã³ã¹ãã¤ã«ãããªãã®ã§å¤ããã©ã¦ã¶ã®ãµãã¼ããããå¿ è¦ãããæã¯ä½¿ç¨ãããã¨ãã§ãã¾ããã ES6ã使ãããå ´é¢(ç¹ã«v-bindæã®æååãã³ãã¬ã¼ãã®ä½¿ç¨)ã§ä½¿ããªããã¨ã«ãããå¯èªæ§ãè½ã¡ãå ´åãããã¾ãã 以ä¸ã¯inputã¿ã°ã«åçãªclassãã¤ããæã®ä¾ã«ãªãã¾ãã
[åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®ãã³ãã¬ã¼ã]
[Hamlå
ã«æ¸ãããã³ãã¬ã¼ã]
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®Lintãå°å ¥ãã
åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã¯HTMLãJavaScriptã®Linterã使ç¨ã§ããªããããæ°ãã«å°ç¨ã®Linterãå¿ è¦ã§ãã ããã®å°å ¥ã«ãããã³ã¼ãã®è³ªã®æ ä¿ã»ã³ã¼ãã£ã³ã°ã«ã¼ã«ã®çµ±ä¸ãå®ç¾ãã¾ãã
ææ°çããã±ã¼ã¸ã¸ç¶ç¶çãªUpdateä½å¶ã®ç¢ºç«
ããã±ã¼ã¸ã¯å®æçã«ã¢ãããã¼ãããªãã¨å·®åã大ãããªããããã¢ãããã¼ããããã¨ããã¨å¤§æªæãããæããããã¾ãã 幸ãã«ã¡ããã¢ã§ã¯Rubyã®Gemã宿çã«ã¢ãããã¼ãããä½å¶ãã§ãã¦ãããããããã¨åããã¦ããã±ã¼ã¸ãã¢ãããã¼ããã¦ããä½å¶ã«ãã¦ããããã§ãã
ãªã©ãªã©Webpackerå°å
¥ãæ©ã«ãããJavaScriptã®éçºãã¢ãã³ã«ãã¦ããããéæãããã¾ãã
ããã§ããã®éæãå®ç¾ããããã«ç§»è¡è¨ç»ãç«ã¦ã¾ããã
- Webpackerã®å°å ¥
- ä¸é¨Browserifyã§ãã«ããã¦ããã³ã¼ããWebpackerã«ç§»æ¤ããã¨åæã«åä¸ãã¡ã¤ã«ã³ã³ãã¼ãã³ãã®Lintãå°å ¥ãã
- å¾ã ã«Browserifyã§ãã«ããã¦ããã³ã¼ããWebpackerã«ç§»ãã¦ãããã¤CommonJSãES Modulesã«ç½®ãæã
- Webpackerã¸ã®å®å ¨ç§»è¡ã¨ã¨ãã«Browserifyã®ã¢ã³ã¤ã³ã¹ãã¼ã«
- yarn upgradeä½å¶ã®ç¢ºç«
Webpackerã®å°å ¥ã§æ°ãã¤ãããã¨
æå¾ã«ã¡ããã¢ã«ãããWebpackerã®å°å ¥ã§æ°ãã¤ããé¨åãå ±æãã¾ãã
Dockerç¨ã®è¨å®
ã¡ããã¢ã§ã¯éçºç°å¢ã«Dockerãå©ç¨ãã¦ãã¾ãã ããããããã©ã«ãã®Webpackerã®è¨å®ã§ã¯hostãlocalhostã«è¨å®ããã¦ããããããã¹ãOSã®ãã©ã¦ã¶ããDockerä¸ã®éçºç°å¢ã«ã¢ã¯ã»ã¹ã§ããªããã以ä¸ã®ãããªè¨å®ãå¿ è¦ã§ãã
https://github.com/rails/webpacker#development
# webpacker.yml dev_server: host: localhost # <= ããã0.0.0.0ã«å¤æ´ port: 3035 hmr: false https: false
config/webpack/environment.jsã®æ¡å¼µ
Webpackerã®2ç³»ã§ã¯plugin, loader, aliasã®è¨å®ã¯config/webpack/shared.js
ã«è¨è¿°ããã°ããã£ãã®ã§ããã3ç³»ããshared.jsã廿¢ããããã®è¾ºãã®è¨å®ãnode_modules
以ä¸ã®@rails/webpacker
ã«æ ¼ç´ããã¦ãã¾ãã
ãã¡ããaliasçã®è¨å®ãç´æ¥node_modules
以ä¸ã«è¿½è¨ãããã¨ã¯ã§ãã¾ããããã®ãããä»åã¯webpack-merge
ã使ã£ã¦config/webpack/environment.js
ã«ãããã®è¨å®ãã¾ããã
# environment.js const { environment } = require('@rails/webpacker') const merge = require('webpack-merge') module.exports = merge(environment.toWebpackConfig(), { resolve: { alias: { vue: 'vue/dist/vue.js' }, }, });
ä»åã¯aliasã ãã§ãããplugin, loaderãªã©ã®è¨å®ãããã«è¿½å ãã¦ããã°webpackã®è¨å®ããã¾ããã¨ã§ãããã§ãã
çµããã«
ã¾ã ã¾ã ã¢ãã³ãªç°å¢ã¸ã®ç§»è¡ã¯éåã°ã§ãããä»å¾ãå¤åã®æ¿ããããã³ãã¨ã³ãã®æè¡ã«è¿½å¾ã§ããããã«ç°å¢ã®æ¹ååã³æè¡åã®åä¸ã«åªãã¦ããããã¨èãã¦ãã¾ãã ãã®ä¸è²«ã¨ãã¦ãã¡ããã¢ã§ã¯æ¯é±ç«ææ¥ã®19:30ãVue.jsã®ããããä¼ãéå¬ãã¦ãã¾ãã æ¯éã¨ããåå ããï¼
ã¾ãRailsã¨ã³ã¸ãã¢ãããã³ãã¨ã³ãã¨ã³ã¸ãã¢ãçµ¶è³åéä¸ã§ãã®ã§å°ãã§ãèå³ãæã£ãæ¹ã¯ä¸åº¦ã¡ããã¢ã«éã³ã«æ¥ã¦ãã ããï¼
æ¯éèªè ã«ãªã£ã¦ãã ãã(âï¸ ÕਠÕ)âï¸
ã¡ããã¢ã§ã¯ä¸ç·ã«åã仲éãåéãã¦ãã¾ãã ãå¿åããå¾ ã¡ãã¦ããã¾ãï¼
â åéãã¸ã·ã§ã³ã¯ãã¡ã
https://medpeer.co.jp/recruit/entry/
â éçºç°å¢ã¯ãã¡ã