boilerplate
This commit is contained in:
parent
0fee4eab1d
commit
edcddcf887
14 changed files with 21816 additions and 0 deletions
12
config/paths.js
Normal file
12
config/paths.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Source files
|
||||||
|
src: path.resolve(__dirname, '../src'),
|
||||||
|
|
||||||
|
// Production build files
|
||||||
|
build: path.resolve(__dirname, '../dist'),
|
||||||
|
|
||||||
|
// Static files that get copied to build folder
|
||||||
|
public: path.resolve(__dirname, '../public'),
|
||||||
|
}
|
69
config/webpack.common.js
Normal file
69
config/webpack.common.js
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
|
||||||
|
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||||
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
|
||||||
|
const paths = require('./paths')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Where webpack looks to start building the bundle
|
||||||
|
entry: [paths.src + '/index.js'],
|
||||||
|
|
||||||
|
// Where webpack outputs the assets and bundles
|
||||||
|
output: {
|
||||||
|
path: paths.build,
|
||||||
|
filename: '[name].bundle.js',
|
||||||
|
publicPath: '/',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Customize the webpack build process
|
||||||
|
plugins: [
|
||||||
|
// Removes/cleans build folders and unused assets when rebuilding
|
||||||
|
new CleanWebpackPlugin(),
|
||||||
|
|
||||||
|
// Copies files from target to destination folder
|
||||||
|
new CopyWebpackPlugin({
|
||||||
|
patterns: [
|
||||||
|
{
|
||||||
|
from: paths.public,
|
||||||
|
to: 'assets',
|
||||||
|
globOptions: {
|
||||||
|
ignore: ['*.DS_Store'],
|
||||||
|
},
|
||||||
|
noErrorOnMissing: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Generates an HTML file from a template
|
||||||
|
// Generates deprecation warning: https://github.com/jantimon/html-webpack-plugin/issues/1501
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
title: 'webpack Boilerplate',
|
||||||
|
favicon: paths.src + '/images/favicon.png',
|
||||||
|
template: paths.src + '/template.html', // template file
|
||||||
|
filename: 'index.html', // output file
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
|
||||||
|
// Determine how modules within the project are treated
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
// JavaScript: Use Babel to transpile JavaScript files
|
||||||
|
{ test: /\.js$/, use: ['babel-loader'] },
|
||||||
|
|
||||||
|
// Images: Copy image files to build folder
|
||||||
|
{ test: /\.(?:ico|gif|png|jpg|jpeg)$/i, type: 'asset/resource' },
|
||||||
|
|
||||||
|
// Fonts and SVGs: Inline files
|
||||||
|
{ test: /\.(woff(2)?|eot|ttf|otf|svg|)$/, type: 'asset/inline' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
resolve: {
|
||||||
|
modules: [paths.src, 'node_modules'],
|
||||||
|
extensions: ['.js', '.jsx', '.json'],
|
||||||
|
alias: {
|
||||||
|
'@': paths.src,
|
||||||
|
assets: paths.public,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
38
config/webpack.dev.js
Normal file
38
config/webpack.dev.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
const { merge } = require('webpack-merge')
|
||||||
|
|
||||||
|
const common = require('./webpack.common')
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
// Set the mode to development or production
|
||||||
|
mode: 'development',
|
||||||
|
|
||||||
|
// Control how source maps are generated
|
||||||
|
devtool: 'inline-source-map',
|
||||||
|
|
||||||
|
// Spin up a server for quick development
|
||||||
|
devServer: {
|
||||||
|
historyApiFallback: true,
|
||||||
|
open: true,
|
||||||
|
compress: true,
|
||||||
|
hot: true,
|
||||||
|
port: 8080,
|
||||||
|
},
|
||||||
|
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
// Styles: Inject CSS into the head with source maps
|
||||||
|
{
|
||||||
|
test: /\.(sass|scss|css)$/,
|
||||||
|
use: [
|
||||||
|
'style-loader',
|
||||||
|
{
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: { sourceMap: true, importLoaders: 1, modules: false },
|
||||||
|
},
|
||||||
|
{ loader: 'postcss-loader', options: { sourceMap: true } },
|
||||||
|
{ loader: 'sass-loader', options: { sourceMap: true } },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
55
config/webpack.prod.js
Normal file
55
config/webpack.prod.js
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
||||||
|
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
|
||||||
|
const { merge } = require('webpack-merge')
|
||||||
|
|
||||||
|
const paths = require('./paths')
|
||||||
|
const common = require('./webpack.common')
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
mode: 'production',
|
||||||
|
devtool: false,
|
||||||
|
output: {
|
||||||
|
path: paths.build,
|
||||||
|
publicPath: '/',
|
||||||
|
filename: 'js/[name].[contenthash].bundle.js',
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.(sass|scss|css)$/,
|
||||||
|
use: [
|
||||||
|
MiniCssExtractPlugin.loader,
|
||||||
|
{
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: {
|
||||||
|
importLoaders: 2,
|
||||||
|
sourceMap: false,
|
||||||
|
modules: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'postcss-loader',
|
||||||
|
'sass-loader',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
// Extracts CSS into separate files
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: 'styles/[name].[contenthash].css',
|
||||||
|
chunkFilename: '[id].css',
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
optimization: {
|
||||||
|
minimize: true,
|
||||||
|
minimizer: [new CssMinimizerPlugin(), '...'],
|
||||||
|
runtimeChunk: {
|
||||||
|
name: 'runtime',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
performance: {
|
||||||
|
hints: false,
|
||||||
|
maxEntrypointSize: 512000,
|
||||||
|
maxAssetSize: 512000,
|
||||||
|
},
|
||||||
|
})
|
9
jsconfig.json
Normal file
9
jsconfig.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": "./",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
},
|
||||||
|
"allowJs": true
|
||||||
|
}
|
||||||
|
}
|
21499
package-lock.json
generated
Normal file
21499
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
50
package.json
Normal file
50
package.json
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{
|
||||||
|
"name": "webpack-boilerplate",
|
||||||
|
"version": "3.0.2",
|
||||||
|
"description": "Sensible webpack 5 boilerplate using Babel and PostCSS.",
|
||||||
|
"main": "index.js",
|
||||||
|
"author": "Tania Rascia",
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"start": "cross-env NODE_ENV=development webpack serve --config config/webpack.dev.js",
|
||||||
|
"build": "cross-env NODE_ENV=production webpack --config config/webpack.prod.js",
|
||||||
|
"lint": "eslint 'src/**/*.js' || true",
|
||||||
|
"prettify": "prettier --write 'src/**/*.js'"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"webpack",
|
||||||
|
"webpack 5",
|
||||||
|
"webpack boilerplate"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@github.com:taniarascia/webpack-boilerplate"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.20.7",
|
||||||
|
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
||||||
|
"@babel/preset-env": "^7.20.2",
|
||||||
|
"babel-loader": "^9.1.0",
|
||||||
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
|
"copy-webpack-plugin": "^11.0.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
|
"css-loader": "^6.7.3",
|
||||||
|
"css-minimizer-webpack-plugin": "^4.2.2",
|
||||||
|
"eslint": "^8.31.0",
|
||||||
|
"eslint-config-prettier": "^8.6.0",
|
||||||
|
"eslint-import-resolver-webpack": "^0.13.2",
|
||||||
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
|
"html-webpack-plugin": "^5.5.0",
|
||||||
|
"mini-css-extract-plugin": "^2.7.2",
|
||||||
|
"postcss-loader": "^7.0.2",
|
||||||
|
"postcss-preset-env": "^7.8.3",
|
||||||
|
"prettier": "^2.8.1",
|
||||||
|
"sass": "^1.57.1",
|
||||||
|
"sass-loader": "^13.2.0",
|
||||||
|
"style-loader": "^3.3.1",
|
||||||
|
"webpack": "^5.75.0",
|
||||||
|
"webpack-cli": "^5.0.1",
|
||||||
|
"webpack-dev-server": "^4.11.1",
|
||||||
|
"webpack-merge": "^5.8.0"
|
||||||
|
}
|
||||||
|
}
|
7
postcss.config.js
Normal file
7
postcss.config.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
'postcss-preset-env': {
|
||||||
|
browsers: 'last 2 versions',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
26
src/index.js
Normal file
26
src/index.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// Test import of a JavaScript module
|
||||||
|
// import { example } from '@/js/example'
|
||||||
|
|
||||||
|
// Test import of an asset
|
||||||
|
// import webpackLogo from '@/images/webpack-logo.svg'
|
||||||
|
|
||||||
|
// Test import of styles
|
||||||
|
import '@/styles/index.scss'
|
||||||
|
|
||||||
|
// Appending to the DOM
|
||||||
|
// const logo = document.createElement('img')
|
||||||
|
// logo.src = webpackLogo
|
||||||
|
|
||||||
|
const heading = document.createElement('h1')
|
||||||
|
heading.textContent = example()
|
||||||
|
|
||||||
|
// Test a background image url in CSS
|
||||||
|
const imageBackground = document.createElement('div')
|
||||||
|
imageBackground.classList.add('image')
|
||||||
|
|
||||||
|
// Test a public folder asset
|
||||||
|
// const imagePublic = document.createElement('img')
|
||||||
|
// imagePublic.src = '/assets/example.png'
|
||||||
|
|
||||||
|
const app = document.querySelector('#root')
|
||||||
|
app.append(logo, heading, imageBackground, imagePublic)
|
3
src/js/example.js
Normal file
3
src/js/example.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export const example =
|
||||||
|
() => `Sensible webpack 5 boilerplate using Babel and PostCSS with a hot dev server
|
||||||
|
and an optimized production build.`
|
25
src/styles/_scaffolding.scss
Normal file
25
src/styles/_scaffolding.scss
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
html {
|
||||||
|
font-size: $font-size;
|
||||||
|
font-family: $font-family;
|
||||||
|
background: $background-color;
|
||||||
|
color: $font-color;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: auto;
|
||||||
|
text-align: center;
|
||||||
|
max-width: $page-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
display: inline-block;
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
//background-image: url('~assets/example.png');
|
||||||
|
background-size: cover;
|
||||||
|
}
|
5
src/styles/_variables.scss
Normal file
5
src/styles/_variables.scss
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
$font-size: 1rem;
|
||||||
|
$font-family: sans-serif;
|
||||||
|
$background-color: #121212;
|
||||||
|
$font-color: #dae0e0;
|
||||||
|
$page-width: 650px;
|
4
src/styles/index.scss
Normal file
4
src/styles/index.scss
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
|
||||||
|
@import 'variables';
|
||||||
|
@import 'scaffolding';
|
14
src/template.html
Normal file
14
src/template.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
||||||
|
|
||||||
|
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue