$ node -v
v14.15.0
$ npm -v
6.14.8
$ cd sample
### npm
$ npm -y init
$ npm -D install webpack webpack-cli
$ npx webpack -v
webpack 5.21.2
webpack-cli 4.5.0
$ npm -D i sass-loader node-sass style-loader css-loader
$ npm -D i mini-css-extract-plugin optimize-css-assets-webpack-plugin
$ npm i -D webpack-dev-server
$ npm install –save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader
$ npm install –save-dev react react-dom
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack-dev-server",
"dev": "webpack --mode development",
"build": "webpack --mode production",
"watch": "webpack --mode development --watch --color --progress"
},
ディレクトリ構成
webpack.config.js
var webpack = require('webpack');
var path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = (env, argv)=> {
const IS_DEVELOPMENT = argv.mode === 'development';
return {
mode: argv.mode,
entry: {
'index': './js/index.js',
},
devltool: IS_DEVELOPMENT ? 'source-map': 'none',
output: {
filename: '[name].js',
path: path.resolve(__dirname,'../dist'),
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
path: path.resolve(__dirname,'../dist'),
})
],
resolve: {
extensions: [".ts"]
},
module: {
rules: [
{
test:/\.ts$/,
use: "ts-loader"
},
{
test:/\.js$/,
use: [
{
loader:"babel-loader",
options: {
presets: [
"@babel/preset-env"
]
}
}
]
},
{
test:/index\.scss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader:'css-loader',
options: {
url: false,
}
},
{
loader: "postcss-loader",
options: [
require("autoprefixer")({
grid: true,
})
]
}
]
}
]
},
}
};
$ webpack –mode development
[webpack-cli] ValidationError: Invalid options object. Mini CSS Extract Plugin has been initialized using an options object that does not match the API schema.
– options has an unknown property ‘path’. These properties are valid:
ん?
なんでや。。
var debug = process.env.NODE_ENV !== "production";
var webpack = require('webpack');
var path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
context:path.join(__dirname, "src"),
entry: "./js/client.js",
output: {
path: __dirname + "/dest/js",
filename: "client.min.js"
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /\.jsx?$/,
exclude: /(node_modules|bower_components)/,
use: [{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react', '@babel/preset-env']
}
}]
},
{
test: /\.scss$/,
use: [
{ loader: MiniCssExtractPlugin.loader },
{ loader: 'css-loader' },
{ loader: 'sass-loader' },
],
}
]
},
devServer: {
contentBase: __dirname + '/src',
host: "0.0.0.0"
},
plugins: debug ? [] : [
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.optimize.UglifyJsPlugin({ mangle: false, sourcemap: false}),
]
};
$ webpack-cli serve –mode development
ℹ 「wds」: Project is running at http://0.0.0.0:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /home/vagrant/dev/sample/src
ℹ 「wdm」: asset client.min.js 364 KiB [emitted] (name: main)
runtime modules 432 bytes 3 modules
cacheable modules 335 KiB
modules by path ../node_modules/webpack-dev-server/client/ 20.9 KiB 10 modules
modules by path ../node_modules/html-entities/lib/*.js 61 KiB 5 modules
modules by path ../node_modules/url/ 37.4 KiB 3 modules
modules by path ../node_modules/querystring/*.js 4.51 KiB
../node_modules/querystring/index.js 127 bytes [built]
../node_modules/querystring/decode.js 2.34 KiB [built]
../node_modules/querystring/encode.js 2.04 KiB [built]
modules by path ../node_modules/webpack/hot/*.js 1.42 KiB
../node_modules/webpack/hot/emitter.js 75 bytes [built]
../node_modules/webpack/hot/log.js 1.34 KiB [built]
../node_modules/webpack/hot/ sync nonrecursive ^\.\/log$ 170 bytes [built]
webpack 5.21.2 compiled successfully in 1271 ms
ℹ 「wdm」: Compiled successfully.
ん!
とりあえず作り始めるか。