ãã£ã±ãwebpackãããããªãïŒãšããœãŒã2ïŒ
ã¯ããã«
ãã£ã±ãwebpackãããããªãïŒãšããœãŒã1ïŒããã®ç¶ãã§ããããããnpmããããããªããåèã«ããŠãã ããã
ããŒããŒ(Loader)ãšã¯
webpackã¯ãåºæ¬çã«ã¯JavaScriptã®ããŒã¿ããæ±ãããšãã§ããŸãããããã§ãCSSãç»åãªã©ãJavaScriptã®ãªããžã§ã¯ãã«ããŠãwebpackã§æ±ããããã«ããã¢ãžã¥ãŒã«ãããŒããŒã§ãããªãœãŒã¹ããããã«ãããŒããŒãååšããŸãã
CSSã¯ãšããããç»åãJavaScriptã«ãããšããã®ã¯äœã ãäžæè°ãªè©±ã§ããããŸãããç»åãåºæ¬çã«ã¯ã³ã³ãã¥ãŒã¿ãŒã®ããŒã¿ã§ãã®ã§ãJavaScriptã§äœ¿çšã§ããããŒã¿ã«å€æããããšã¯å¯èœã§ãã
ããŒããŒåã³ãã³ãã«ã®æ³šæç¹
ãããã®ãªãœãŒã¹ãJavaScriptã®ããŒã¿ã«ããŠã©ããããã§ãããwebpackã¯ã¢ãžã¥ãŒã«ãã³ãã©ãŒã§ãã®ã§ããã¡ããããããJavaScriptã®ããŒã¿ãšããŠ1ã€ã«ãŸãšããŸãããã ããããã§æ³šæç¹ãããã®ã§ãããäœã§ãããã§ããã³ãã«ããã®ã¯å¥œãŸãããããŸããã
確ãã«ããŒã¿ããŸãšããŠéä¿¡åæ°ãæžããããšã«ãããããã©ãŒãã³ã¹ïŒè¡šç€ºé床ïŒããããããšãã§ããã®ã§ããããã³ãã«ã¯è«žåã®å£ã§ãã£ãŠã代ããã«ããŒã¿éãå¢ããŸããJavaScriptã«ãŸãšããã®ã§ãJavaScriptã®å®¹éãå¢ããã®ã¯ãã¡ããã§ããããã³ãã«ããCSSãç»åãªã©ã®ããŒã¿ã¯ãå ã®å®¹éãã倿åŸã®å®¹éã®æ¹ãå€ããªããã¡ã§ãã ã§ã¯ããªããã³ãã«ããã®ãã§ãããããã§ãè€æ°åéä¿¡ãããããã¯ããã©ãŒãã³ã¹ãããããã§ããã ãããããã¯å Žåã«ãããããšãªããŸããäŸãã°ã倿°ã®å°ããªç»åãè€æ°åéä¿¡ããã®ãªããJavaScriptã«ãã³ãã«ããã»ããããã©ãŒãã³ã¹ã«ããã§ããã倧ããªç»åã1ã€éä¿¡ããã®ã«ãã³ãã«ãããšããã®1åã®éä¿¡ã³ã¹ããããããŒã¿éã®ã³ã¹ãã®æ¹ã倧ãããªã£ãŠããŸããŸããããããèŠæ¥µããã®ãæè¡è ã®è ã®èŠãæã§ããããŸãããwebpackã§ããçšåºŠèšå®ããããšãå¯èœã§ãã
CSS
ã§ã¯ã代衚çãªããŒããŒã§ããcss-loaderã䜿çšããŠãããŒããŒã®äœ¿ãæ¹ã説æããŸãã
CSSãwebpackã§æ±ããããã«ããã«ã¯ãcssãJavaScriptã«ãã³ãã«ããcss-loaderãšããã³ãã«ãããCSSãHTMLã§ã¹ã¿ã€ã«ã·ãŒããšããŠèªã¿èŸŒãŸããããã«ããstyle-loaderãå¿
èŠã«ãªããŸãã
ãŸãã¯ãã€ã³ã¹ããŒã«ãããŸãããã
$ npm i -D style-loader css-loader
webpack.config.js
moduleããããã£ã远å ãã«ãŒã«ãèšå®ããŸãã
module.exports = {
module:{
rules:[
{
test:/\.css$/,
use:['style-loader','css-loader']
}
]
}
}
ååã®ç¶ãããèšè¿°ãããšã次ã«ãªããŸãã
const path = require('path');
module.exports = {
context: path.join(__dirname, "src"),
entry: `./index.js`,
output: {
path: path.join(__dirname, "dist"),
filename: "main.js"
},
module:{
rules:[
{
test:/\.css$/,
use:['style-loader','css-loader']
}
]
},
};
ããŠãæ¬ã³ã³ãã³ãã®é¡åããã£ã±ãwebpackãããããªããã§ãããããããªããªãã®ã¯ããããã§ãã ãã®èŸºãããwebpack.config.jsã®èšè¿°ãè€éã«ãªã£ãŠããŸãã
ãã®èšå®ããã©ã®ãããªæ§é ã«ãªã£ãŠããããããããŸããïŒãšããœãŒã1ã§ã説æããŸããããwebpackã®èšå®ã¯ã©ããŸã§ãã£ãŠãããããã£ã«å€ãèšå®ããŠããã ããšãªããŸãã
ãã®äŸã§ãããšã以äžãšãªããŸãã1ã€ãã€ãã£ãããšç¢ºèªããŠã¿ãŠãã ããã
-
moduleãªããžã§ã¯ãã®exportsããããã£ã«moduleããããã£ãèšå®ããŠããã - ãã®
moduleããããã£ã«é åãšããŠrulesããããã£ãèšå®ããŠãªããžã§ã¯ããä»£å ¥ããtestããããã£ãšuseããããã£ãèšå®ããŠããã -
testããããã£ã«ã¯æ£èŠè¡šçŸãèšå®ããuseããããã£ã«ã¯é åãèšå®ããŠããã
ã€ãŸãããããæŒç®åã§è¡šçŸãããšä»¥äžã®ããã«ãªããŸãã
module.exports.module.rules[0].test = /\.css$/;
module.exports.module.rules[0].use[0] = 'style-loader';
module.exports.module.rules[0].use[1] = 'css-loader';
éåãšãããããããªã£ãã®ã§ã¯ãªãã§ããããããããåãããªã人ã¯JavaScriptã®ãªããžã§ã¯ããçè§£ã§ããŠããªãã®ã§ãããããåŠãã ã»ããããã§ããGulpãã©ããèªããªããšãã人ãã倧æµJavaScriptã®ãªããžã§ã¯ããçè§£ã§ããŠããªãå Žåãå€ãã§ãã
ã§ã¯ãåããããã£ã®èª¬æãããŸãã
-
module
ããŒããŒãªã©ã®ã¢ãžã¥ãŒã«ã®èšå®ãããããããã£ã§ãã -
module.rules
åããŒããŒãèšå®ããããããã£ã§ããé åãšãªã£ãŠããããã®åèŠçŽ ã«åããŒããŒã®ã«ãŒã«ãèšå®ããŠè¡ããŸãã -
rules.test
ããããã£åããã¯æ³åãã«ããã§ãããæ£èŠè¡šçŸãªã©ã§è©²åœãããã¡ã€ã«ãæå®ããŸãã -
rules.use
䜿çšããããŒããŒãæå®ããããããã£ã§ãã
ã¡ãªã¿ã«webpackã¯ããã®testããuseãªã©ãšãããããã°ã©ãã³ã°åå¿è
ãéã³ååã§åã£ãŠä»ãããããªããããã£åãå€ãã®ããåããã«ããããŠããèŠå ã®1ã€ã§ããã€ãŸããwebpackãåããã«ãããšããã®ã¯ãããªããããããããã°ã©ãã³ã°ãã§ããããã§ããããŸãã®ã§ãå®å¿ããŠãã ããã
ãã«ã
ã§ã¯ãå®éã«ãã¡ã€ã«ãçšæããŠãã«ãããŠã¿ãŸãããã
â» index.htmlã¯ãã«ãããŸããã®ã§ãçŽæ¥åºåå
ãžèšçœ®ããŸãã
import './style.css';
body {
color: red;
font-weight: bold;
}
<!doctype html>
<html lang="ja">
<head>
<script src="./main.js"></script>
</head>
<body>
<p>TEST</p>
</body>
</html>
ããã§ãã«ããããšãindex.htmlã§ã¯CSSãã¡ã€ã«ãèªã¿èŸŒãã§ããŸããããmain.jsã«ãã€ã³ããããŠããããã¹ã¿ã€ã«ã·ãŒããåæ ãããŸãã
options
sourceããããã£ã§ãœãŒã¹ãããåºåã®èšå®ãããŸããããåããŒããŒã®ãœãŒã¹ããããå«ããã«ã¯ãsourceMapããããã£ãèšå®ããå¿
èŠããããŸããtrueã§åºåãfalseãŸãã¯èšå®ãªãã§åºåããŸããã
ãã®ãããªäœ¿çšãããªãã·ã§ã³ã¯optionsããããã£ãèšçœ®ããŸããæ¬¡ã®ããã«optionsããããã£ãçšæããŠãsourceMapããããã£ãèšå®ããŸãããã
module: {
rules: [
{
test: /\.css/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
}
}
]
}
]
},
ããŠãmoduleããããã£ã«ã¯css-loader以å€ã«ãããŒããŒãèšå®ããŠããããšã«ãªãã®ã§ããããã®éœåºŠsourceMapããããã£ã®èšå®ãè¡ãããšã«ãªããŸãããããã£ãŠãdevelopmentã¢ãŒãã§ã¯ããŒããŒã®ãœãŒã¹ãããã¯å¿
èŠãªããªã©ãšãã£ãå Žåãåèšå®ã倿Žããªããã°ãªããŸããããã®ãããªå Žåãæ§ã
ãªæ¹æ³ã¯ãããŸãããäŸãã°æ¬¡ã®ãããªæ¹æ³ã§ãŸãšããŠèšå®ã§ããŸãã
// MODE倿°ã§modeã®å€ãèšå®ããã
const MODE = "development";
// MODE倿°ãdevelopmentãªãsourceMapStatusãtrueã«ããã
const sourceMapStatus = MODE === "development";
module.exports = {
mode: MODE,
module: {
// çç¥
options: {
sourceMap: sourceMapStatus
}
};
css-loaderã§ãã䜿ããªãã·ã§ã³ããã1ã€ãã玹ä»ããŠãããŸããurlãªãã·ã§ã³ã§ããurlãªãã·ã§ã³ã¯ãCSSå
ã®url()ã®æå¹ç¡å¹ãèšå®ããŸããããã©ã«ãã§ã¯trueãšãªã£ãŠããŸãã
options: {
url: false,
sourceMap: sourceMapStatus,
}
Sass
CSSã®æ¬¡ã¯Sassã§ãããããŠã§ããã¶ã€ããŒããããã³ããšã³ããšã³ãžãã¢ãŸã§ãçŸåšã¹ã¿ã€ã«ã·ãŒãã®ã³ãŒãã£ã³ã°ã«ã¯ãã»ãšãã©ã®æ¹ãSassã䜿çšããŠãããšæããŸãã
SassãCSSã«å€æããããŒããŒã«ã¯sass-loaderã䜿çšããŸãããŸããã³ã³ãã€ã«ãè¡ãã¢ãžã¥ãŒã«ãšããŠsassãå¿ èŠã§ãã®ã§ãå ±ã«ã€ã³ã¹ããŒã«ãããŸãã
$ npm i -D sass-loader node-sass
webpack.config.jsã®èšå®ãããŠãããŸãããããšããããã¯ãtestããããã£ãsassãšscssãã¡ã€ã«ãèªããããã«ããuseããããã£ã§äœ¿çšããããŒããŒãèšå®ããã ãã§OKã§ãããªãã䜿çšããããŒããŒãèšå®ã¯ãåŸãããé çªã«é©çšãããŸãã
module: {
rules: [
{
test: /\.(sass|scss|css)$/,
use:['style-loader','css-loader','sass-loader']
}
]
},
ã§ã¯ãå®è¡ã«å¿ èŠãªãã¡ã€ã«ãçšæããŸãã
import './style.scss';
$color: red;
$weight: bold;
body {
color: $color;
font-weight: $weight;
}
<!doctype html>
<html lang="ja">
<head>
<script src="./main.js"></script>
</head>
<body>
<p>TEST</p>
</body>
</html>
ããã§ãã«ããè¡ããš style.scssãCSSã«å€æããããã€main.jsã«ãã€ã³ããããŸãã
ãŸããCSSã§èšè¿°ããããã«ãããŒããŒã«åããŠèšå®ãã§ããŸãã
module: {
rules: [
{
test: /\.(sass|scss|css)$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
url: false,
sourceMap: true,
}
},
{
loader: "sass-loader",
options: {
sourceMap: true,
}
}
]
}
]
},
ãã®å Žåããuseããããã£ã®åŸãããèšå®ããé ã«ãé©çšãããŠè¡ããŸããã€ãŸããæ¬¡ã®é çªãšãªããŸãã
- sass-loader: SassãCSSã«å€æ
- css-loader: CSSãJavaScriptã«ãã³ãã«
- style-loader: HTMLã®linkã¿ã°ã«CSSãå±é
CSSå ã®ç»åããã³ãã«
ãããŸã§ãurlããããã£ã®å€ãfalseã«ããŠããŸããã®ã§ãCSSå
ã®url()ã¯ç¡å¹ãšãªããç»åã¯èªã¿èŸŒãŸããŸããã§ããããããtrueã«ãããšç»åããã«ãããããããèªã¿èŸŒãŸããã®ã§ãããJavaScriptã«ãã³ãã«ãããã«ã¯å¥ã®èšå®ãå¿
èŠãšãªããŸãã
ç»åãJavaScriptã«ãã³ãã«ãããšããããšã¯ãç»åãJavaScriptã§äœ¿çšå¯èœãªããŒã¿ã«å€æããªããã°ãããªãã®ã§ããããã®ããã«ç»åãbase64ãšãã圢åŒã«å€æããŸããããã§ã¯è©³ãã説æããŸããããbase64ã¯ã¢ã«ãã¡ãããã®å€§æåå°æåãæ°åãèšå·ãå«ãã64æåã§æ§æããããšã³ã³ãŒãæ¹åŒãšãªããŸãïŒå®éã¯65æåãšãªãïŒãJavaScriptã¯ãBase64ã®ãšã³ã³ãŒããšãã³ãŒãã«å¯Ÿå¿ãã颿°ãæã£ãŠããŸãã
webpack4ãŸã§ã¯ãç»åãBase64ã«ãšã³ã³ãŒãããŠåã蟌ãã®ã«url-loaderã䜿çšããŠããŸããããwebpack5ããã¯æèŒãããŠããtypeããããã£ã§å¯Ÿå¿ã§ããŸãã
rulesããããã£ã®é
åã«æ°ãããšã¬ã¡ã³ããèšããŠãtestããããã£ã§å¯Ÿè±¡ãã¡ã€ã«ãèšå®ãtypeããããã£ã®å€ãasset/inlineã«ããããšã«ãããäžæ¬ã§å
šãŠã®ãã¡ã€ã«ããã³ãã«ããŸãããŸããcss-loaderã®urlããããã£ãtrueããã®ãå¿ããªãã§äžããã
module: {
rules: [
{
test: /\.(sass|scss|css)$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
// url()ãæ©èœãããã
url: true,
sourceMap: true,
}
},
{
loader: "sass-loader",
options: {
sourceMap: true,
}
},
]
},
// 远å
{
test: /\.(gif|png|jpg|svg)$/,
type: "asset/inline",
}
]
},
å®è¡ããsassãã¡ã€ã«ã«background-imageããããã£ã远å ããŠãåãéå±€ã«ç»åãèšçœ®ããŸãããã
$color: red;
$weight: bold;
body {
color: $color;
font-weight: $weight;
background-image: url(img.png);
}
ããã§å®è¡ãããšãç»åããã³ãã«ãããŸãã
ãã³ãã«ããç»åãåãã
ããŒããŒåã³ãã³ãã«ã®æ³šæç¹ã§ã¯ãäœã§ãããã§ããã³ãã«ããã®ã¯å¥œãŸãããªããšèª¬æããŸãããäŸãã°ãç»åãBase64ã«ãšã³ã³ãŒãããå Žåã容éã¯çŽ1.33åã«ãªã£ãŠããŸããŸãããããã£ãŠãéä¿¡ã³ã¹ããšæ¯èŒããŠãããã§ããã³ãã«ããã»ããããå°ããªç»åã¯ãã³ãã«ããŠãéä¿¡ã³ã¹ããã容éã®å¢å ã³ã¹ããé«ãç»åã¯ããã®ãŸãŸäœ¿çšãããããŸãã
ãŸã説æãããã®ããtypeããããã£ã®å€ãasset/inlineã«ããŠãã³ãã«ãããŠããŸãããããããasset/resourceã«ãããšãç»åã¯åºåãããŸãããã³ãã«ã¯ãããŸãããã€ãŸããç»åã«ãã£ãŠasset/inlineãasset/resourceããåãæ¿ããã°ããããã§ãã
ãŸããtypeããããã£ã®å€ãassetãšãã©ã£ã¡ã€ããã®èšå®ã«ããŸãããããŠãparser.dataUrlCondition.maxSizeã§ãã³ãã«ããæå€§ãã¡ã€ã«å€ãèšå®ããŸããã€ãŸãããããè¶
ããç»åã¯ãã³ãã«ãããŸããã
{
test: /\.(gif|png|jpg|svg)$/,
type: "asset",
parser: {
dataUrlCondition: {
// ããã§100KB以äžãšããèšå®ã«ãªãã
maxSize: 100 * 1024,
},
},
}
ãã©ã°ã€ã³(Plugins)
ããŒããŒã¯ããªãœãŒã¹ãwebpackã§æ±ããããã«ããããã®ãã®ã§ããããã®ããŒããŒã§ã¯å®çŸã§ããªãæ©èœãæäŸããã®ããã©ã°ã€ã³ã§ãã
mini-css-extract
mini-css-extractãã©ã°ã€ã³ã¯ããã³ãã«ããJavaScriptããã¹ã¿ã€ã«ã·ãŒãã®ç®æãcssãã¡ã€ã«ãšããŠåºåããŸããã€ãŸããéåžžã®ãŠã§ããµã€ãå¶äœã®ããã«ãCSSãã¡ã€ã«ãlinkã¿ã°ã§èªã¿èŸŒãããšãã§ããŸãã
ãã©ã°ã€ã³ã䜿çšããã«ã¯ã䜿çšããããã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
$ npm i -D mini-css-extract-plugin
äœ¿ãæ¹ã§ãããrequire()ã§ãã©ã°ã€ã³ãèªã¿èŸŒã¿ãããŒããŒã§ãã©ã°ã€ã³ãæå¹ã«ããŸãããããŠããã©ã°ã€ã³ã®èšå®ãè¡ããŸãã
以äžãããããããããããã«ãä»ã®èšå®ã¯å¿ èŠæäœéã«ããŠããŸãã
// ãã©ã°ã€ã³ã®èªã¿èŸŒã¿
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
entry: `./src/index.js`,
output: {
path: `${__dirname}/dist`,
filename: "index.js"
},
module: {
rules: [
{
test: /\.(sass|scss|css)$/,
use: [
// CSSãã¡ã€ã«ãæžãåºããªãã·ã§ã³ãæå¹ã«ãã
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
},
// sassã䜿çšããªãå Žåã¯äžå¿
èŠ
{
loader: 'sass-loader',
}
]
}
]
},
// ãã©ã°ã€ã³ã®èšå®
plugins: [
new MiniCssExtractPlugin({
// åºåå
ã®èšå®
filename: './css/[name].css',
}),
],
};
ã§ã¯ããã䜿çšãããã©ã°ã€ã³ã2ã€ç޹ä»ããŠãããŸãã
html-webpack-plugin
ãããŸã§ãåºåå
ã®ãã£ã¬ã¯ããªå
ã«çŽæ¥htmlãã¡ã€ã«ã眮ããŠããŸããããã¡ããã§ããããã®ããã«åºåå
ãšå
ã«å·®ãããéçºã¯å¥œãŸãããããŸãããããã§ãhtmlãã¡ã€ã«ãåãããã«ãã«ããããã®ã§ããããããè¡ãã®ãhtml-webpack-pluginã§ãã察象ãšããhtmlãã¡ã€ã«ããã«ãããŠãããŸãããã®éãJavaScriptãšCSSã®èªã¿èŸŒã¿èšå®ãããŠãããŸãã
ã€ã³ã¹ããŒã«ããŸãã
$ npm i -D html-webpack-plugin
åãããã«require()ã§ãã©ã°ã€ã³ãèªã¿èŸŒã¿ããã©ã°ã€ã³ã®èšå®ãããŠããŸããä»åã¯ç¹ã«ããŒããŒåŽã®èšå®ã¯ããŸããã
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: `./src/index.js`,
output: {
path: `${__dirname}/dist`,
filename: "index.js"
},
module: {
rules: [
{
test: /\.(sass|scss|css)$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
},
{
loader: 'sass-loader',
}
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: './css/[name].css',
}),
// html-webpack-pluginã®èšå®
new HtmlWebpackPlugin({
// 察象ã®ãã³ãã¬ãŒããèšå®
template: `${__dirname}/src/index.html`,
// æžãåºãå
filename: `${__dirname}/dist/index.html`,
// ãã«ãããjsãã¡ã€ã«ãèªã¿èŸŒãå Žæãããã©ã«ãã¯head
inject: 'body'
}),
],
};
templateããããã£ã§ãããèšå®ããªããšèªåã§htmlãã¡ã€ã«ãåºåãããŸãããŸããsrcé
äžã«index.ejsãããã°ãããã䜿çšããŸããEJSã®äœ¿ãæ¹ã¯ããã§ã¯èª¬æããŸããããJavaScriptã§äœ¿çšãããã³ãã¬ãŒããšããŠãããããŒãããã¿ãŒãªã©ã«åå²ããŠç®¡çããããšãå¯èœãšãªããŸãã
EJS
copy-webpack-plugin
copy-webpack-pluginã¯ãæå®ãããã¡ã€ã«ããã®ãŸãŸã³ããŒããŠåºåããŸããããããåºåå
ãšå
ãåãããã®ã«åœ¹ç«ã¡ãŸãã
$ npm i -D copy-webpack-plugin
以äžã/src/img/å
ã®ãã¡ã€ã«ãå
šãŠ/dist/img/ã«ã³ããŒããŸãã
const CopyWebpackPlugin = require('copy-webpack-plugin');
çç¥
plugins: [
new CopyWebpackPlugin({
patterns: [
{
from: `${__dirname}/src/img/`,
to: `${__dirname}/dist/img/`,
}
]
}),
],
imagemin-webpack-plugin
copy-webpack-pluginã¯ãã¡ã€ã«ãå§çž®ããŸãã
$ npm i -D imagemin-webpack-plugin
åãã¡ã€ã«åœ¢åŒã«å¯Ÿå¿ããããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
// jpg
$ npm i -D imagemin-pngquant
// png
$ npm i -D imagemin-mozjpeg
// gif
$ npm i -D imagemin-gifsicle
// svg
$ npm i -D imagemin-svgo
詳ãã説æã¯çç¥ããŸãããæ¬¡ã¯èšå®äŸãšãªããŸãã
const ImageminMozjpeg = require('imagemin-mozjpeg');
çç¥
plugins: [
new ImageminPlugin({
test: /\.(jpe?g|png|gif|svg)$/i,
pngquant: {
quality: '70-85'
},
gifsicle: {
interlaced: false,
optimizationLevel: 9,
colors: 256
},
plugins: [
ImageminMozjpeg({
quality: 85,
progressive: true
})
],
svgo: {},
})
]
æåŸã«
ãšããœãŒã2ã¯ãšããããããã§çµããã«ããŠãããŸãããã以äžããã§èª¬æããŠããŸããšãæããããããããŸãŸãã¢ã€ã¢ã€ããæ°æã¡ã§çµããããšã«ãªãã ããããã§ãããšããœãŒã2ãåé¿ãããã°ããšããœãŒã3ãæžããããšæããŸãã
ä»ãŸã§ReactããTypeScriptãªã©ã§webpackã®èšå®ãèŠãŠãïŒïŒã£ããšãªã£ãŠãã人ãããšããœãŒã1ã2ãèªãã åŸã«å床webpackã®èšå®ãèŠããšããŸãã§æ°·ã溶ãããã®ããã«ã¹ãŒã£ãšé ã®äžã«å 容ãå ¥ã£ãŠãããšæããŸãã
æåŸã®æåŸã«ããããã°æ¥åãã§ããäžçŽè ã«ãªãããã®JavaScriptå ¥éïŒææ³ç·šïŒãDOMç·šãå ¬éããŠãããŸãã®ã§ãç¡æå ¬éããŒãžã ãã§ãèªãã§ãã£ãŠãã ããã
Discussion
ïŒãšïŒæèŠããŸããïŒ
ãã«ãã®æå³ãããããå°ãåé²ããæ°ãããŸããããããšãããããŸãïŒïŒãèªãŸããŠããã ããŸãã