Webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.
Base Template: webpack-template
Author: To code | Youtube guide in Russian
# Download repository:
git clone https://github.com/vedees/webpack-template-pug webpack-template-pug
# Go to the app:
cd webpack-template-pug
# Install dependencies:
npm install
# Server with hot reload at http://localhost:8081/
npm run dev
# Output will be at dist/ folder
npm run build
src/pug/layout
- put custom layout for pagessrc/pug/includes
- all app includessrc/pug/utils
- pug mixins and othersrc/pug/pages
- put custom app pages. Don't forget to import them inindex.js
src/assets/scss
- put custom app SCSS styles here. Don't forget to import them inindex.js
src/assets/css
- the same as above but CSS here. Don't forget to import them inindex.js
src/assets/img
- put images here. Don't forget to use correct path:assets/img/some.jpg
src/js
- put custom app scripts heresrc/index.js
- main app file where you include/import all required libs and init appsrc/components
- folder with custom.vue
componentsstatic/
- folder with extra static assets that will be copied into output folder
Easy way to move all files. Default:
const PATHS = {
// Path to main app dir
src: path.join(__dirname, '../src'),
// Path to Output dir
dist: path.join(__dirname, '../dist'),
// Path to Second Output dir (js/css/fonts etc folder)
assets: 'assets/'
}
Change any folders:
const PATHS = {
// src must be src
src: path.join(__dirname, '../src'),
// dist to public
dist: path.join(__dirname, '../public'),
// assets to static
assets: 'static/'
}
- Install libs
- Import libs in
./index.js
// React example
import React from 'react'
// Bootstrap example
import Bootstrap from 'bootstrap/dist/js/bootstrap.min.js'
// or
import 'bootstrap/dist/js/bootstrap.min.js'
- Install libs
- Go to
/assets/scss/utils/libs.scss
- Import libs in node modules
// Sass librarys example:
@import '../../node_modules/spinners/stylesheets/spinners';
// CSS librarys example:
@import '../../node_modules/flickity/dist/flickity.css';
- Create another js module in
./js/
folder - Import modules in
./js/index.js
file
// another js file for example
import './common.js'
- .pug dir:
./pug/pages
- Configurations: in
./build/webpack.base.conf.js
Usage: All files must be created in the./pug/pages
folder. Example:
./pug/pages/index.pug
./pug/pages/about.pug
Example for ./pug/mynewfolder/pages
:
- Change
./build/webpack.base.conf.js
const PAGES_DIR:
// Your new path
const PAGES_DIR = `${PATHS.src}/pug/mynewfolder/pages/`
- Rerun webpack dev server
Automatic creation any pug pages:
- Create another pug file in
./pug/pages/
- Open new page
http://localhost:8081/about.html
(Don't forget to RERUN dev server)
Manual (not Automaticlly) creation any pug pages (Don't forget to RERUN dev server and COMMENT lines above)
- Create another pug file in
./pug/pages/
- Go to
./build/webpack.base.conf.js
- Comment lines above (create automaticlly pug pages)
- Create new page in pug:
new HtmlWebpackPlugin({
template: `${PAGES_DIR}/about/index.pug`,
filename: './about/index.html',
inject: true
}),
new HtmlWebpackPlugin({
template: `${PAGES_DIR}/about/portfolio.pug`,
filename: './about/portfolio.html',
inject: true
})
- Open new page
http://localhost:8081/about.html
(Don't forget to RERUN dev server)
Сombine the first method and the second. Example:
...PAGES.map(page => new HtmlWebpackPlugin({
template: `${PAGES_DIR}/${page}`,
filename: `./${page.replace(/\.pug/,'.html')}`
}))
new HtmlWebpackPlugin({
template: `${PAGES_DIR}/about/index.pug`,
filename: './about/index.html',
inject: true
})
Default: already have
- Install vue
npm install vue --save
- Init vue
index.js
:
const app = new Vue({
el: '#app'
})
- Create div id app
#app
//- Content
- Install vuex
npm install vuex --save
- Import Vuex
import store from './store'
- Create index.js in
./store
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// vuex content
})
Create your component in /components/
PUG Usage:
- Init component in
index.js
:
Vue.component('example-component', require('./components/Example.vue').default)
- Any pug files:
example-component
VUE Usage:
- import components in .vue:
import example from '~/components/Example.vue'
- Register component:
components: {
example
}
- Init in vue component:
<example />
Add @font-face in /assets/scss/utils/fonts.scss
:
// Example with Helvetica
@font-face {
font-family: "Helvetica-Base";
src: url('/assets/fonts/Helvetica/Base/Helvetica-Base.eot'); /* IE9 Compat Modes */
src: url('/assets/fonts/Helvetica/Base/Helvetica-Base.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('/assets/fonts/Helvetica/Base/Helvetica-Base.woff') format('woff'), /* Pretty Modern Browsers */
url('/assets/fonts/Helvetica/Base/Helvetica-Base.ttf') format('truetype'), /* Safari, Android, iOS */
url('/assets/fonts/Helvetica/Base/Helvetica-Base.svg') format('svg'); /* Legacy iOS */
}
Add vars for font in /assets/scss/utils/vars.scss
:
$mySecontFont : 'Helvetica-Base', Arial, sans-serif;
Add custom CSS to CSS overrides field
in Aristotle theme settings.
If element has semitransparent background or color (e.g. checkbox and radio buttons) use this field
and don't forget to use !important
property.
js-form-type-checkbox label.option:before {
border-color: #2f3758 !important;
}
.js-form-type-checkbox input:not(:checked)~label.option:hover:before {
background: rgba(74, 211, 176, .8) !important;
box-shadow: 0 0 0 2px rgba(74, 211, 176, .8) !important;
}
Copyright (c) 2018-present, Evgenii Vedegis