May 10, 2021
Vanilla JS로 프로젝트를 진행할 때 제가 자주 사용하는 세팅을 정리한 글입니다. 전체 코드 및 Boilerplate는 아래 링크의 레포지토리에서 확인하실 수 있습니다.
yarn init
yarn add -D eslint prettier eslint-config-prettier eslint-config-airbnb-base eslint-plugin-import
yarn add -D webpack webpack-cli webpack-dev-server
yarn add -D babel-loader css-loader mini-css-extract-plugin html-webpack-plugin
yarn add -D @babel/core @babel/eslint-parser @babel/preset-env
라이선스의 변화 Husky v4까지는 MIT 라이선스였기 때문에 사용하는 데 있어 아무런 제약이 없었다. 하지만 Husky v5에서는 약간의 변화가 생겼다. 현재 v5는 한시적인 기간, 조금 더 자세히 말하면 Early Access 기간에는 Parity License를 적용한다. 간단히 말해 “우리 저작물을 사용하려면 당신 저작물도 오픈하라”라는 것이다. GPL처럼 오픈하는 라이선스에 대해서는 제약을 두지 않고 있으나 결국 상업용 프로젝트에는 사용할 수 없다는 의미다. 단, Husky 프로젝트에 후원한 단체/개인에 한해서는 코드를 공개하지 않고도 사용할 수 있다. 다시 말해, Husky v5는 현재 오픈소스 혹은 프로젝트 후원자의 상업용 프로젝트에만 사용할 수 있다. 그 외의 경우에는 라이선스 위반이 된다.
프라이빗 레포에서 사용하실 경우 최신 버전이 아닌 4.X 버전을 사용하셔야 합니다!
yarn add -D lint-staged husky
package.json
"lint-staged": {
"*.js": "eslint --cache",
"*.{js,css,md,html,json}": "prettier --write"
},
yarn husky install
npx husky add .husky/pre-commit "npx lint-staged"
yarn add -D cypress
yarn add -D eslint-plugin-cypress
.eslintrc.js
add configextends: [plugin:cypress/recommended'],
node_modules
.DS_Store
.eslintcache
module.exports = {
printWidth: 120,
singleQuote: true,
};
module.exports = {
env: {
browser: true,
es2021: true,
},
parser: "@babel/eslint-parser",
extends: ["airbnb-base", "prettier"],
parserOptions: {
ecmaVersion: 2021,
sourceType: "module",
},
plugins: [],
rules: {},
};
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = (_, argv) => {
const isDevelopment = argv.mode !== 'production';
return {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'build'),
clean: true,
},
devServer: {
port: 3000,
hot: true,
},
devtool: isDevelopment ? 'eval-source-map' : 'source-map',
module: {
rules: [
{
test: /\.(js)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
cacheCompression: false,
compact: !isDevelopment,
},
},
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
],
},
plugins: [
new HtmlWebpackPlugin({ template: './index.html' }), //
new MiniCssExtractPlugin({ filename: 'style.css' }),
],
performance: {
hints: isDevelopment ? 'warning' : 'error',
},
};
};
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: '> 1% and last 2 versions',
},
],
],
};
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.trimTrailingWhitespace": true,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"prettier.useEditorConfig": true,
"prettier.enable": true,
}
"scripts": {
"test": "yarn run cypress open",
"prod": "webpack serve --mode=production",
"dev": "webpack serve --mode=development",
"build": "webpack --mode=production"
},