webpack은 모듈 번들러입니다. 우리가 작성한 소스코드나 리소스 이미지들을 한번에 묶어서 번들 단위로 사용자에게 제공할 수 있도록 도와줍니다. 우리가 작성한 소스코드를 압축하고 코드에 적힌 변수를 변환 하는 기능도 수행합니다.
최신의 es6나 scss 등을 사용해 작성한 파일들을 webpack에게 주면 webpack은 브라우저가 알아들을 수 있는 일반적인 js와 css로 변환시켜준다고 생각하면 됩니다.
%npm install --save-dev webpack
%npm install --save-dev webpack-cli
youtube
*|package.json
+|webpack.config.js
+|assets
+|js
+|main.js
+|scss
+|styles.scss
package.json 에서 아래와 같이 기존 start script명을 변경해주고 script를 추가해줍니다. 백엔드 부분과 프런트엔드 부분을 나눠준다고 생각할 수 있습니다. dev:assets
와 build:assets
로 나눈것은 mode와 관련된 것인데요. 뒤에서 이유를 알 수 있습니다. dev:assets
뒤에 -w는 watch를 의미하며 entry에 있는 파일들이 수정되는 걸 지켜본다는 뜻입니다. 재실행하지 않아도 실시간으로 수정해줍니다.
"scripts":{
"dev:server": "nodemon --exec babel-node init.js --delay 2",
"dev:assets": "WEBPACK_ENV=development webpack -w",
"build:assets": "WEBPACK_ENV=production webpack"
}
webpack.config.js는 webpack이 호출되면 가장 먼저 확인하는 설정 파일입니다.
설명에 따르면 webpack 버전4부터 설정 파일이 필요없다고 하지만 우리는 만들어서 몇가지 설정을 해보겠습니다. webpack.config.js에서는 babel이 적용되지 않으므로(서버측과 분리하여 생각) es5의 문법을 사용합니다. 설정에 앞서 이해를 돕기 위해 몇가지 용어 설명 먼저 하겠습니다.
const path = require('path');
module.exports = {
entry: path.resolve(__dirname, 'assets', 'js', 'main.js'),
output: {
filename: '[name].js',
path: path.join(__dirname, 'static');
},
};
module: {
rules: [
{
test: /\.txt$/,
use: 'raw-loader'
}
]
}
방법 1.
module: {
rules: [
{
test: /\.scss$/,
use: ['css-loader', 'sass-loader']
},
{
text: '',
use: [],
}
]
}
방법 2.
module: {
rules:[
{
test: /\.scss$/,
use: [
{loader: 'css-loader'},
{loader: 'sass-loader'}
]
}
]
}
const MODE = process.env.WEBPACK_ENV;
// .env파일이 아니라 package.json scripts에서 받아오는겁니다.
// scipts에서 설정한 이름과 동일해야합니다.
//.env파일을 사용하지 않는건 사용할 수 없어서 입니다.
module.exports = {
mode: MODE
}
%npm install babel-loader
%npm install postcss-loader
%npm install autoprefixer
%npm install sass-loader
%npm install --save-dev mini-css-extract-plugin
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
plugins: [
new MiniCssExtractPlugin(),
],
module: {
rules: [
{
test: /\.(scss)$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
],
},
};
const path = require("path");
const autoprefixer = require("autoprefixer");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const mode = process.env.WEBPACK_ENV;
module.exports = {
mode,
entry: path.resolve(__dirname, "assets", 'js', 'main.js'),
output: {
filename: '[name].js',
path: path.join(__dirname, 'static')
},
module: {
rules: [
{
test: /\.(js)$/,
use: ['babel-loader']
},
{
test: /\.(scss)$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
[
"autoprefixer",
{
//변환될 코드의 target을 의미합니다.
overrideBrowserslist:"cover 99.5%"
},
],
],
},
},
},
'sass-loader'
],
},
],
},
plugins: [
new MiniCssExtractPlugin({filename: 'styles.css'}),
],
}
변환할 scss root 파일을 import 해줍니다. entry 파일로 config 해준건 main.js 뿐이기 때문에 scss파일을 import 해주지 않으면 sccs 파일을 변환하지 않습니다.
import '../scss/styles.scss';
변환할 scss 파일을 작성해주면 됩니다.
npm run dev:assets
%npm run dev:assets
터미널에 입력하고 static 폴더 생성 및 폴더 안에 js파일과 css파일이 생성되면 webpack 설정 완료.
안녕하세요
설명해주신 그대로 했을때
asset main.js 5.74 KiB [compared for emit] (name: main)
runtime modules 931 bytes 4 modules
cacheable modules 68 bytes
./assets/js/main.js 29 bytes [built][code generated]
./assets/scss/styles.scss 39 bytes [built][code generated] [1 error]
ERROR in ./assets/scss/styles.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleError: Module Error (from ./node_modules/sass-loader/dist/cjs.js):
Cannot find module 'sass'
Require stack:
at Object.emitError (/Users/oseung-u/wetube/node_modules/webpack/lib/NormalModule.js:447:6)
at getSassImplementation (/Users/oseung-u/wetube/node_modules/sass-loader/dist/utils.js:59:21)
at Object.loader (/Users/oseung-u/wetube/node_modules/sass-loader/dist/index.js:35:59)
@ ./assets/js/main.js 1:0-29
2 ERRORS in child compilations
webpack 5.13.0 compiled with 3 errors in 566 ms
라며 mian.js만 생성되고 style.scss는 생성이 안되는 오류가 발생하는데 혹시 어떤이유때문인지 알수 있을까요ㅠ