├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .nvmrc ├── .ruby-version ├── 404.html ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _config_production.yml ├── _i18n ├── en.yml └── en │ ├── _posts │ ├── 2017-08-07-Write-your-articles-with-kramdown.md │ ├── 2017-08-08-Jekyll-webpack-boilerplate-release.md │ └── 2019-03-12-new-article-written-with-netlify-cms.md │ └── about.md ├── _images ├── icon.png └── large-logo.png ├── _includes ├── cookie-consent.html ├── disqus_comments.html ├── doorbell.html ├── footer.html ├── google-analytics.html ├── head.html ├── navigation.html ├── scripts.html └── service-worker.html ├── _layouts ├── .gitignore ├── amp.html ├── blog.html ├── home.html ├── page.html └── post.html ├── _scss └── _default.scss ├── _src ├── index.js ├── index.scss └── template │ └── default.html ├── about.md ├── admin ├── config.yml └── index.html ├── blog.md ├── config ├── manifest.json ├── postcss.config.js ├── sw.config.js ├── webpack.common.js ├── webpack.dev.js ├── webpack.prod.js └── webpack.pwa.js ├── icon.png ├── index.md ├── netlify.toml ├── package-lock.json ├── package.json └── webpack.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | end_of_line = lf 3 | insert_final_newline = true 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | _site 2 | assets 3 | 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | "extends": "airbnb-base" 3 | }; 4 | 5 | module.exports = config; -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: sandoche 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: https://www.paypal.me/kanbanote 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | .jekyll-metadata 4 | node_modules 5 | assets 6 | yarn-error.log 7 | .yarnclean 8 | .jekyll-cache 9 | 10 | # editors 11 | .idea -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v14.18.0 -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.7.1 -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | 18 | 19 |
20 |

404

21 | 22 |

Page not found :(

23 |

The requested page could not be found.

24 |
25 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | # Hello! This is where you manage which Jekyll version is used to run. 4 | # When you want to use a different version, change it below, save the 5 | # file and run `bundle install`. Run Jekyll with `bundle exec`, like so: 6 | # 7 | # bundle exec jekyll serve 8 | # 9 | # This will help ensure the proper Jekyll version is running. 10 | # Happy Jekylling! 11 | gem "jekyll", "4.2.1" 12 | 13 | # If you want to use GitHub Pages, remove the "gem "jekyll"" above and 14 | # uncomment the line below. To upgrade, run `bundle update github-pages`. 15 | # gem "github-pages", group: :jekyll_plugins 16 | 17 | # If you have any plugins, put them here! 18 | group :jekyll_plugins do 19 | gem "jekyll-feed" 20 | gem 'jekyll-sitemap' 21 | gem 'jekyll-seo-tag' 22 | gem 'octopress-minify-html' 23 | gem 'jekyll-multiple-languages-plugin' 24 | gem 'amp-jekyll' 25 | end 26 | 27 | # Windows does not include zoneinfo files, so bundle the tzinfo-data gem 28 | gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 29 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | addressable (2.8.0) 5 | public_suffix (>= 2.0.2, < 5.0) 6 | amp-jekyll (1.0.3) 7 | fastimage (>= 1.8.0) 8 | jekyll (>= 3.0, < 5.0) 9 | nokogiri (>= 1.6.0) 10 | colorator (1.1.0) 11 | concurrent-ruby (1.1.9) 12 | css_press (0.3.2) 13 | csspool-st (= 3.1.2) 14 | json 15 | csspool-st (3.1.2) 16 | em-websocket (0.5.2) 17 | eventmachine (>= 0.12.9) 18 | http_parser.rb (~> 0.6.0) 19 | eventmachine (1.2.7) 20 | eventmachine (1.2.7-x64-mingw32) 21 | execjs (2.8.1) 22 | fastimage (2.2.5) 23 | ffi (1.15.4) 24 | ffi (1.15.4-x64-mingw32) 25 | forwardable-extended (2.6.0) 26 | html_press (0.8.2) 27 | htmlentities 28 | multi_css (>= 0.1.0) 29 | multi_js (>= 0.1.0) 30 | htmlentities (4.3.4) 31 | http_parser.rb (0.6.0) 32 | i18n (1.8.10) 33 | concurrent-ruby (~> 1.0) 34 | jekyll (4.2.1) 35 | addressable (~> 2.4) 36 | colorator (~> 1.0) 37 | em-websocket (~> 0.5) 38 | i18n (~> 1.0) 39 | jekyll-sass-converter (~> 2.0) 40 | jekyll-watch (~> 2.0) 41 | kramdown (~> 2.3) 42 | kramdown-parser-gfm (~> 1.0) 43 | liquid (~> 4.0) 44 | mercenary (~> 0.4.0) 45 | pathutil (~> 0.9) 46 | rouge (~> 3.0) 47 | safe_yaml (~> 1.0) 48 | terminal-table (~> 2.0) 49 | jekyll-feed (0.15.1) 50 | jekyll (>= 3.7, < 5.0) 51 | jekyll-multiple-languages-plugin (1.7.0) 52 | jekyll (>= 2.0, < 5.0) 53 | jekyll-sass-converter (2.1.0) 54 | sassc (> 2.0.1, < 3.0) 55 | jekyll-seo-tag (2.7.1) 56 | jekyll (>= 3.8, < 5.0) 57 | jekyll-sitemap (1.4.0) 58 | jekyll (>= 3.7, < 5.0) 59 | jekyll-watch (2.2.1) 60 | listen (~> 3.0) 61 | json (2.5.1) 62 | kramdown (2.3.1) 63 | rexml 64 | kramdown-parser-gfm (1.1.0) 65 | kramdown (~> 2.0) 66 | liquid (4.0.3) 67 | listen (3.7.0) 68 | rb-fsevent (~> 0.10, >= 0.10.3) 69 | rb-inotify (~> 0.9, >= 0.9.10) 70 | mercenary (0.4.0) 71 | mini_portile2 (2.6.1) 72 | multi_css (0.1.0) 73 | css_press 74 | multi_js (0.1.0) 75 | uglifier (~> 2) 76 | nokogiri (1.12.5) 77 | mini_portile2 (~> 2.6.1) 78 | racc (~> 1.4) 79 | nokogiri (1.12.5-x64-mingw32) 80 | racc (~> 1.4) 81 | octopress-hooks (2.6.2) 82 | jekyll (>= 2.0) 83 | octopress-minify-html (1.3.1) 84 | html_press (~> 0.8) 85 | jekyll (>= 2.0) 86 | octopress-hooks 87 | pathutil (0.16.2) 88 | forwardable-extended (~> 2.6) 89 | public_suffix (4.0.6) 90 | racc (1.5.2) 91 | rb-fsevent (0.11.0) 92 | rb-inotify (0.10.1) 93 | ffi (~> 1.0) 94 | rexml (3.2.5) 95 | rouge (3.26.1) 96 | safe_yaml (1.0.5) 97 | sassc (2.4.0) 98 | ffi (~> 1.9) 99 | sassc (2.4.0-x64-mingw32) 100 | ffi (~> 1.9) 101 | terminal-table (2.0.0) 102 | unicode-display_width (~> 1.1, >= 1.1.1) 103 | tzinfo (2.0.4) 104 | concurrent-ruby (~> 1.0) 105 | tzinfo-data (1.2021.3) 106 | tzinfo (>= 1.0.0) 107 | uglifier (2.7.2) 108 | execjs (>= 0.3.0) 109 | json (>= 1.8.0) 110 | unicode-display_width (1.8.0) 111 | 112 | PLATFORMS 113 | ruby 114 | x64-mingw32 115 | 116 | DEPENDENCIES 117 | amp-jekyll 118 | jekyll (= 4.2.1) 119 | jekyll-feed 120 | jekyll-multiple-languages-plugin 121 | jekyll-seo-tag 122 | jekyll-sitemap 123 | octopress-minify-html 124 | tzinfo-data 125 | 126 | BUNDLED WITH 127 | 1.16.4 128 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 - 2018 Sandoche ADITTANE 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

5 | Jekyll-webpack-boilerplate 6 |

7 | 8 | 9 | ![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg) 10 | [![Telegram](https://img.shields.io/badge/chat-Telegram-blue.svg)](https://t.me/JekyllWebpack) 11 | [![Medium Badge](https://badgen.net/badge/icon/medium?icon=medium&label)](https://medium.com/@sandoche) 12 | [![Twitter: sandochee](https://img.shields.io/twitter/follow/sandochee.svg?style=social)](https://twitter.com/sandochee) 13 | 14 | A Jekyll boilerplate supercharged with Webpack to build modern performant websites (including Progressive Web Apps). 15 | Read more about how this boilerplate has been built: https://medium.com/learning-lab/5-how-i-learnt-webpack-3-and-created-a-jekyll-and-webpack-boilerplate-edd86645fd5e 16 | 17 | ## Features 18 | 19 | **Improved workflow** 20 | * Webpack working along with Jekyll 21 | * BrowserSync live reload 22 | 23 | **Optimized Style and SASS** 24 | * SASS Style 25 | * PostCSS Auto Preffixer 26 | * CSS minified 27 | 28 | **ES6 & Optimization** 29 | * ES6 Babel 30 | * JS minified and uglified 31 | * ES Lint 32 | 33 | **Images optimized** 34 | * Imagemin, images optimizations 35 | 36 | **Write less code** 37 | * Theme color in config 38 | * Favicon generated automatically 39 | * Google Analytics setup in config file (optional) 40 | * Doorbell setup in config file (optional) 41 | * Cookie consent setup in config file (optional) 42 | 43 | **SEO Ready** 44 | * SEO Plugin Jekyll 45 | * Sitemap generated 46 | * Accelerated Mobile Pages enabled for Posts 47 | 48 | **Write better code** 49 | * Internationalization plugin 50 | 51 | **Progressive Web Apps (optional)** 52 | * Generation of the Manifest 53 | * Generation of Service worker 54 | 55 | **CMS Admin panel** 56 | * Works with Netlify CMS 57 | 58 | **Easy to deploy** 59 | * Easy deployment with Netlify 60 | 61 | ## Prerequisites 62 | The following tools should be installed before starting: 63 | * NodeJS, npm 64 | * Ruby, Gem, Bundler 65 | * Jekyll 66 | * Sass 67 | * Distro package build-essential libpng-dev 68 | 69 | ## Quick start 70 | 1. Make sure you have all the prerequisites above installed. 71 | 2. Clone this repo using `git clone https://github.com/sandoche/Jekyll-webpack-boilerplate.git` 72 | 3. Move to the appropriate directory: `cd Jekyll-webpack-boilerplate`. 73 | 4. Run `npm install` and `bundler install` in order to install dependencies and clean the git repo. 74 | 5. Run `npm start` to start the development server (or use `npm start`). 75 | 76 | ## Quick deployment 77 | [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/sandoche/Jekyll-webpack-boilerplate) 78 | 79 | Here is a demo of the Netlify build: https://dazzling-swartz-9738b5.netlify.com 80 | 81 | ### Netlify CMS 82 | 83 | It also works with Netlify CMS after enabling Identity service and Git Gateway: https://www.netlifycms.org/docs/add-to-your-site/#enable-identity-and-git-gateway 84 | 85 | See `admin/config.yml` for more customization. 86 | 87 | ## Development 88 | To start the development server just run `npm start` 89 | 90 | ### Folder structure 91 | ``` 92 | . 93 | ├── 404.html 94 | ├── about.md 95 | ├── blog.md 96 | ├── config <--- This folder contains the different Webpack config files 97 | │   ├── manifest.json <--- Please edit this file if you want a PWA 98 | │   ├── postcss.config.js <--- Post css config 99 | │   ├── sw.config.js <--- The service worker config file 100 | │   ├── webpack.common.js <--- The common Webpack config file for all the environment 101 | │   ├── webpack.dev.js <--- Dev Webpack environment config file 102 | │   ├── webpack.prod.js <--- Prod Webpack environment config file 103 | │   └── webpack.pwa.js 104 | ├── _config.yml <--- The Jekyll config file that you need to set up 105 | ├── Gemfile 106 | ├── Gemfile.lock 107 | ├── _i18n <--- Contains your posts and data in the language you need (check below how to remove it) 108 | ├── _images <--- Put all your images here, you will access them with this path /assets/images/ 109 | │   ├── icon.png <--- Replace this with your icon 110 | │   └── large-icon.png <--- Replace this with your Facebook Open Graph picture 111 | ├── icon.png <--- Same with this one 112 | ├── _includes 113 | ├── index.md 114 | ├── _layouts 115 | │   ├── amp.html <--- The layout for Accelerated mobile page 116 | │   ├── blog.html 117 | │   ├── home.html 118 | │   ├── page.html 119 | │   └── post.html 120 | ├── LICENSE 121 | ├── package.json <--- Update this file with your information especially the name which is used for the meta tags 122 | ├── README.md 123 | ├── _scss <--- Put your partials here 124 | │   └── _default.scss 125 | ├── _src <--- This folder contains your JS and SASS entry points 126 | │   ├── index.js 127 | │   ├── index.scss 128 | │   └── template 129 | │   └── default.html <--- Here is the main default template, feel free to edit it but do not delete it 130 | ├── webpack.config.js 131 | └── package-lock.json 132 | ``` 133 | You can see above the basic structure of the boilerplate and the main differences with the official Jekyll folder structure 134 | 135 | ### Configurations 136 | * The required configurations are all in `_config.yml` 137 | * Also edit `package.json` the name is used in the meta tags 138 | * If you want a `manifest.json` file please edit `config/manifest.json` 139 | * Replace the different icon by yours in `_images` and in the root folder 140 | 141 | ### Assets 142 | * SCSS partials should be located in `_scss` for better reading 143 | * Put all your images in `_images` the content of this folder will be moved to the `_site/assets/images` so you can access them with this path `/assets/images/**` in your templates, check the examples 144 | * Put all your Javascript files inside `_src` and import them from `index.js` or you can also add them as a new entry point in your webpack configuration file 145 | 146 | ### Internationalization 147 | * All the posts should be there in inside `_i18n` folder inside its language, check the boilerplate examples 148 | * You can put your variables inside `_i18n/en.yml` (replace en with your language) and call them in your template with `{% t variable_name.sub_variable %}` 149 | * You can remove the plugin by removing `gem 'jekyll-multiple-languages-plugin'` from `gemfile` and `jekyll-multiple-languages-plugin` from `plugins` in `_config.yml` 150 | * We invite you to read the very good [official documentation](https://github.com/Anthony-Gaudino/jekyll-multiple-languages-plugin) of the plugin Jekyll multiple language plugin 151 | 152 | ## Build 153 | 154 | ### Optimized website 155 | To build the website run the following line 156 | 157 | ```sh 158 | npm run build 159 | ``` 160 | The built website will be in `_site` folder. 161 | 162 | You can also run a local server to test it with this command 163 | ```sh 164 | npm run serve:dist 165 | ``` 166 | 167 | ### PWA 168 | If you want to build a PWA (including the manifest.json and the service worker) run the following. Please ensure to have configured this file `config/manifest.json` 169 | The built website will be in `_site` folder. 170 | ```sh 171 | npm run build:pwa 172 | ``` 173 | 174 | ### Clean assets & \_site folders 175 | This will remove the generated folders 176 | ```sh 177 | npm run clean:project 178 | ``` 179 | 180 | ## Known issues 181 | * Jekyll watch doesn't reload / rebuild when a translation file is updated inside `_i18n` folder, I recommand to remove `jekyll-multiple-languages-plugin` if you don't want a multi language website and if you want to watch / rebuild faster. Otherwise close and start `npm run start` to rebuild and see your changes from `_i18n` 182 | * Wsl2 requires to run `sudo apt install -y build-essential libpng-dev` in order to fix the `pngquant failed to build, make sure that libpng-dev is installed` issue 183 | 184 | ## Websites using Jekyll Webpack Boilerplate 185 | * Learning Lab - https://learn.uno 186 | * Invitecode.is - http://invitecode.is 187 | * Typster - https://typster.xyz 188 | * TEDxMarseille - https://tedxmarseille.com 189 | * Motive network - https://motive.network 190 | * CoinGenerator - https://coingenerator.sh 191 | 192 | ## Other documentations 193 | * [Jekyll](https://jekyllrb.com/) 194 | * [Webpack](https://webpack.js.org/) 195 | * [Jekyll multiple languages plugin](https://github.com/Anthony-Gaudino/jekyll-multiple-languages-plugin) 196 | * [Jekyll SEO tag](https://github.com/jekyll/jekyll-seo-tag) 197 | * [BrowserSync Webpack plugin](https://www.npmjs.com/package/browser-sync-webpack-plugin) 198 | * [PostCSS](http://postcss.org/) 199 | 200 | ## ⭐️ Show your support 201 | Please ⭐️ this repository if this project helped you! 202 | 203 | [![patreon.png](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/sandoche) 204 | 205 | ## 🍺 Buy me a beer 206 | If you like this project, feel free to donate: 207 | * PayPal: https://www.paypal.me/kanbanote 208 | * Bitcoin: 19JiNZ1LkMaz57tewqJaTg2hQWH4RgW4Yp 209 | * Ethereum: 0xded81fa4624e05339924355fe3504ba9587d5419 210 | * Monero: 43jqzMquW2q989UKSrB2YbeffhmJhbYb2Yxu289bv7pLRh4xVgMKj5yTd52iL6x1dvCYs9ERg5biHYxMjGkpSTs6S2jMyJn 211 | * Motive: MOTIV-25T5-SD65-V7LJ-BBWRD (Get Motive Now: https://motive.network) -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | ### Welcome to Jekyll Webpack Boilerplate 2 | # 3 | # This config file contains the config of your webpages 4 | # You may also want to update /config/webpack.pwa.js in case you want to generate a Progressive Web App 5 | 6 | title: Super-website 7 | email: your-email@example.com 8 | description: A super website made with love 9 | baseurl: "" # the subpath of your site, e.g. /blog 10 | url: "" # the base hostname & protocol for your site, e.g. http://example.com 11 | theme_color: '#c0ffee' 12 | twitter_username: sandochee 13 | github_username: sandoche 14 | author: Sandoche Adittane 15 | logo: assets/images/large-logo.png 16 | twitter: 17 | username: sandochee 18 | social: 19 | name: Sandoche Adittane 20 | links: 21 | - https://twitter.com/sandochee 22 | - https://www.facebook.com/sandoche 23 | - https://www.linkedin.com/in/sandoche 24 | - https://plus.google.com/+SandocheADITTANE 25 | - https://github.com/sandoche 26 | 27 | languages: ["en"] 28 | ampdir: amp 29 | netlify_cms: true 30 | 31 | ### Google webmaster tools, Google Analytics, Doorbell and Cookie consent uncomment and put the API key 32 | #webmaster_verifications: 33 | # google: verification_code 34 | #google_analytics: id 35 | #doorbell: 36 | # id: doorbell_id 37 | # appKey: doorbell_appKey 38 | 39 | #cookie_consent: true 40 | 41 | ### Build settings 42 | markdown: kramdown 43 | minify_html: false 44 | plugins: 45 | - jekyll-feed 46 | - jekyll-sitemap 47 | - jekyll-seo-tag 48 | - octopress-minify-html 49 | - jekyll-multiple-languages-plugin 50 | - amp-jekyll 51 | 52 | ### Exclude from processing. 53 | exclude: 54 | - Gemfile 55 | - Gemfile.lock 56 | - node_modules 57 | - vendor 58 | - _src 59 | - _images 60 | - LICENSE 61 | - package.json 62 | - README.md 63 | - webpack.config.js 64 | - yarn-error.log 65 | - yarn.lock 66 | - config 67 | - optimization-fix 68 | - optimization-fix-this-file-is-ignored.js 69 | - icon.png 70 | -------------------------------------------------------------------------------- /_config_production.yml: -------------------------------------------------------------------------------- 1 | minify_html: true 2 | -------------------------------------------------------------------------------- /_i18n/en.yml: -------------------------------------------------------------------------------- 1 | home: 2 | header: 3 | headline: Your beautiful headline 4 | call_to_action: 5 | title: Check out our blog 6 | link: /blog 7 | 8 | footer: 9 | love: 'Made with ' 10 | -------------------------------------------------------------------------------- /_i18n/en/_posts/2017-08-07-Write-your-articles-with-kramdown.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Write your article with Kramdown" 4 | date: 2017-08-07 14:03:01 +0200 5 | categories: jekyll documentation 6 | author: Sandoche ADITTANE 7 | --- 8 | 9 | You can write your articles with Kramdown [https://kramdown.gettalong.org/documentation.html]. 10 | You can always change this settings in the config file. 11 | 12 | You can put titles. 13 | * lists 14 | 15 | Or even code 16 | 17 | {% highlight ruby %} 18 | def print_hi(name) 19 | puts "Hi, #{name}" 20 | end 21 | print_hi('Tom') 22 | #=> prints 'Hi, Tom' to STDOUT. 23 | {% endhighlight %} 24 | -------------------------------------------------------------------------------- /_i18n/en/_posts/2017-08-08-Jekyll-webpack-boilerplate-release.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "A new boilerplate" 4 | date: 2017-08-08 16:16:01 -0600 5 | categories: jekyll boilerplate 6 | author: Sandoche ADITTANE 7 | --- 8 | This is an example article. 9 | 10 | As you can see in the source code, this file has been put in the /en folder, this is for internalization purpose. 11 | -------------------------------------------------------------------------------- /_i18n/en/_posts/2019-03-12-new-article-written-with-netlify-cms.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: New article written with Netlify CMS 4 | date: 2019-03-12T14:53:49.009Z 5 | categories: test netlify 6 | author: Sandoche ADITTANE 7 | --- 8 | ## This article uses Netlify CMS 9 | 10 | If you see this article it means that Netlify CMS succeeded! 11 | -------------------------------------------------------------------------------- /_i18n/en/about.md: -------------------------------------------------------------------------------- 1 | ![Jekyll webpack boilerplate](/assets/images/icon.png){:style="width:150px; filter: grayscale(100%); opacity: 0.5; float: right; margin-top: -50px;"} 2 | 3 | This website has been built with [Jekyll webpack boilerplate](https://github.com/sandoche/Jekyll-webpack-boilerplate) 4 | 5 | Check our documentation for more information. 6 | -------------------------------------------------------------------------------- /_images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandoche/Jekyll-webpack-boilerplate/3e64586ac731d57e5e7ece7338b1bada88a5e39e/_images/icon.png -------------------------------------------------------------------------------- /_images/large-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandoche/Jekyll-webpack-boilerplate/3e64586ac731d57e5e7ece7338b1bada88a5e39e/_images/large-logo.png -------------------------------------------------------------------------------- /_includes/cookie-consent.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | -------------------------------------------------------------------------------- /_includes/disqus_comments.html: -------------------------------------------------------------------------------- 1 | {% if page.comments != false and jekyll.environment == "production" %} 2 | 3 |
4 | 19 | 20 | {% endif %} 21 | -------------------------------------------------------------------------------- /_includes/doorbell.html: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /_includes/google-analytics.html: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | {% seo %} 15 | 16 | {% if ((jekyll.environment == 'production' or jekyll.environment == 'pwa') and site.google_analytics) %} 17 | {% include google-analytics.html %} 18 | {% endif %} 19 | 20 | {% if site.netlify_cms %} 21 | 22 | {% endif %} -------------------------------------------------------------------------------- /_includes/navigation.html: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /_includes/scripts.html: -------------------------------------------------------------------------------- 1 | {% if jekyll.environment == 'pwa' %} 2 | {% include service-worker.html %} 3 | {% endif %} 4 | 5 | {% if site.doorbell %} 6 | {% include doorbell.html %} 7 | {% endif %} 8 | 9 | {% if site.cookie_consent == true %} 10 | {% include cookie-consent.html %} 11 | {% endif %} 12 | -------------------------------------------------------------------------------- /_includes/service-worker.html: -------------------------------------------------------------------------------- 1 | 29 | -------------------------------------------------------------------------------- /_layouts/.gitignore: -------------------------------------------------------------------------------- 1 | default.html 2 | -------------------------------------------------------------------------------- /_layouts/amp.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: amp 3 | --- 4 | 5 | 6 | 7 | 8 | {{ page.title }} 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | {% capture header %} 18 |

{{ site.title}}

19 |
20 | {% endcapture %} 21 |

22 | {{ header | amp_images }} 23 |

24 | 25 | {{ page.date }} - {{ page.author }} 26 | 27 | {{ content | markdownify | amp_images }} 28 | {% capture footer %}{% endcapture %} 29 | {{ footer | amp_images: false, 24, 24 }} 30 | 31 | 32 | -------------------------------------------------------------------------------- /_layouts/blog.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | {% for post in site.posts %} 6 |
7 | {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %} 8 |
9 |

{{ post.date | date: date_format }}

10 |

by {{ post.author }}

11 |
12 | 18 |
19 | {% endfor %} 20 |
21 | -------------------------------------------------------------------------------- /_layouts/home.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 |

{% t home.header.headline %}

7 | {% t home.header.call_to_action.title %} 8 |
9 |
10 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 | 9 | 10 |
11 | {{ content }} 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 |
7 |

{{ page.title | escape }}

8 | 16 |
17 | 18 |
19 | {{ content }} 20 |
21 | 22 |
23 | {% if site.disqus.shortname %} 24 | {% include disqus_comments.html %} 25 | {% endif %} 26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /_scss/_default.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | $container-width: 1200px; 4 | $container-padding: 30px; 5 | 6 | $primary-color: #C8385A; 7 | $text-color: #333; 8 | $link-color: #7F7F7F; 9 | 10 | $font-xl: 58px; 11 | $font-md: 22px; 12 | $font-sm: 18px; 13 | $font-xs: 16px; 14 | 15 | $system-font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; 16 | $primary-font-family: $system-font-family; 17 | 18 | 19 | 20 | // Mixin 21 | 22 | @mixin container($padding) { 23 | max-width: $container-width; 24 | padding: 0 $padding; 25 | margin: auto; 26 | } 27 | 28 | 29 | // Global 30 | 31 | body { 32 | font-family: $primary-font-family; 33 | color: $text-color; 34 | display: flex; 35 | min-height: 100vh; 36 | flex-direction: column; 37 | } 38 | 39 | main { 40 | flex: 1; 41 | width: 100%; 42 | } 43 | 44 | a { 45 | color: $link-color; 46 | text-decoration: none; 47 | font-size: $font-sm; 48 | 49 | &:hover { 50 | color: $primary-color; 51 | } 52 | } 53 | 54 | 55 | // Shared 56 | 57 | .button { 58 | display: inline-block; 59 | border: 1px solid lighten($link-color, 40%); 60 | border-radius: 50px; 61 | padding: 15px 30px; 62 | font-weight: 300; 63 | 64 | &:hover { 65 | background-color: lighten($link-color, 49%); 66 | } 67 | } 68 | 69 | .accent { 70 | color: $primary-color; 71 | } 72 | 73 | 74 | // Components & pages 75 | 76 | .navigation { 77 | 78 | @include container($container-padding); 79 | 80 | display: flex; 81 | flex-direction: row; 82 | justify-content: space-between; 83 | align-items: center; 84 | 85 | margin-top: 10px; 86 | 87 | padding-bottom: 10px; 88 | border-bottom: 1px solid lighten($link-color, 40%); 89 | 90 | &__branding { 91 | display: flex; 92 | align-items: center; 93 | } 94 | 95 | &__title { 96 | color: $text-color !important; 97 | font-size: $font-md; 98 | font-weight: 500; 99 | } 100 | 101 | &__logo { 102 | margin-right: 10px; 103 | } 104 | 105 | &__logo-img { 106 | height: 40px; 107 | width: 40px; 108 | } 109 | 110 | &__links { 111 | display: flex; 112 | flex-direction: row; 113 | } 114 | 115 | &__link { 116 | margin-left: 30px; 117 | font-size: $font-xs; 118 | 119 | &--active { 120 | color: $primary-color; 121 | } 122 | } 123 | 124 | } 125 | 126 | .home { 127 | 128 | @include container($container-padding); 129 | 130 | height: 65vh; 131 | display: flex; 132 | flex-direction: column; 133 | justify-content: center; 134 | 135 | 136 | &__headline-container { 137 | padding: 0 $container-padding * 3; 138 | } 139 | 140 | &__headline { 141 | font-size: $font-xl; 142 | } 143 | 144 | } 145 | 146 | 147 | .page { 148 | 149 | @include container($container-padding); 150 | margin-top: 60px; 151 | 152 | &__header { 153 | padding: 0 $container-padding; 154 | } 155 | 156 | 157 | &__content { 158 | padding: 0 $container-padding; 159 | } 160 | } 161 | 162 | .blog { 163 | @include container($container-padding); 164 | margin-top: 60px; 165 | 166 | 167 | &__post { 168 | 169 | padding: 0 $container-padding; 170 | display: flex; 171 | flex-direction: row; 172 | padding-top: 50px; 173 | padding-bottom: 50px; 174 | border-bottom: 1px solid lighten($link-color, 40%); 175 | 176 | @media (max-width: 900px) { 177 | flex-direction: column; 178 | } 179 | 180 | &:first-child { 181 | padding-top: 10px; 182 | } 183 | 184 | &:last-child { 185 | border-bottom: none; 186 | } 187 | } 188 | 189 | &__date { 190 | padding-top: 15px; 191 | width: 30%; 192 | color: $link-color; 193 | } 194 | 195 | &__content { 196 | width: 100%; 197 | } 198 | 199 | 200 | &__link { 201 | &:hover { 202 | color: $link-color; 203 | } 204 | } 205 | 206 | &__title { 207 | color: $text-color; 208 | font-size: $font-md; 209 | padding-top: 0; 210 | } 211 | 212 | &__excerpt { 213 | color: $link-color; 214 | } 215 | } 216 | 217 | 218 | .post { 219 | 220 | @include container($container-padding); 221 | margin-top: 80px; 222 | 223 | 224 | &__container { 225 | padding: 0 $container-padding; 226 | } 227 | 228 | &__meta { 229 | padding-bottom: 40px; 230 | margin-bottom: 40px; 231 | border-bottom: 1px solid lighten($link-color, 40%); 232 | } 233 | 234 | } 235 | 236 | 237 | .footer { 238 | border-top: 1px solid lighten($link-color, 40%); 239 | padding: 30px 0; 240 | margin-top: 80px; 241 | 242 | &__container { 243 | @include container($container-padding); 244 | color: $link-color; 245 | } 246 | 247 | } 248 | -------------------------------------------------------------------------------- /_src/index.js: -------------------------------------------------------------------------------- 1 | // CSS and SASS files 2 | import './index.scss'; 3 | -------------------------------------------------------------------------------- /_src/index.scss: -------------------------------------------------------------------------------- 1 | @import 'normalize.css'; 2 | @import '../_scss/default'; 3 | -------------------------------------------------------------------------------- /_src/template/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% include head.html %} 6 | 7 | 8 | 9 | 10 |
11 | {% include navigation.html %} 12 | {{ content }} 13 |
14 | 15 | {% include footer.html %} 16 | 17 | {% include scripts.html %} 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: About 4 | permalink: /about/ 5 | --- 6 | 7 | {% translate_file about.md %} 8 | -------------------------------------------------------------------------------- /admin/config.yml: -------------------------------------------------------------------------------- 1 | backend: 2 | name: git-gateway 3 | branch: master 4 | 5 | publish_mode: editorial_workflow 6 | 7 | media_folder: "_images" 8 | public_folder: "assets/images" 9 | 10 | collections: 11 | - name: "blog" 12 | label: "Blog" 13 | folder: "_i18n/en/_posts" 14 | create: true 15 | slug: "{{year}}-{{month}}-{{day}}-{{slug}}" 16 | editor: 17 | preview: false 18 | fields: 19 | - {label: "Layout", name: "layout", widget: "hidden", default: "post"} 20 | - {label: "Title", name: "title", widget: "string"} 21 | - {label: "Publish Date", name: "date", widget: "datetime"} 22 | - {label: "Title", name: "title", widget: "string"} 23 | - {label: "Categories", name: "categories", widget: "string"} 24 | - {label: "Author", name: "author", widget: "string"} 25 | - {label: "Body", name: "body", widget: "markdown"} 26 | - name: 'text' 27 | label: 'Text' 28 | delete: false # Prevent users from deleting documents in this collection 29 | editor: 30 | preview: false 31 | files: 32 | - name: 'English' 33 | label: 'English Text' 34 | file: '_i18n/en.yml' 35 | description: 'Text of the website' 36 | fields: 37 | - label: 'Home' 38 | name: home 39 | widget: 'object' 40 | fields: 41 | - label: 'Header' 42 | name: header 43 | widget: 'object' 44 | fields: 45 | - { label: 'Headline', name: headline, widget: string } 46 | - label: 'Footer' 47 | name: footer 48 | widget: 'object' 49 | fields: 50 | - { label: 'Love', name: love, widget: string } 51 | -------------------------------------------------------------------------------- /admin/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Content Manager 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /blog.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: blog 3 | title: Blog 4 | permalink: /blog/ 5 | --- 6 | 7 | Hello world 8 | -------------------------------------------------------------------------------- /config/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Jekyll Webpack Boilerplate", 3 | "short_name": "Jekyll Webpack", 4 | "orientation": "portrait", 5 | "display": "standalone", 6 | "start_url": "/", 7 | "description": "⚡️ A boilerplate with Jekyll and Webpack to make the most performant static websites", 8 | "scope": "/", 9 | "theme_color": "#efeeff", 10 | "background_color": "#efeeff" 11 | } -------------------------------------------------------------------------------- /config/postcss.config.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-unused-vars 2 | module.exports = ({ file, options, env }) => ({ 3 | parser: 'postcss-scss', 4 | plugins: { 5 | 'postcss-import': {}, 6 | autoprefixer: {}, 7 | cssnano: env === 'production' ? {} : false, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /config/sw.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | swDest: '_site/service-worker.js', 3 | globPatterns: [ 4 | 'assets/**.css', 5 | '**.html', 6 | '**/**.html', 7 | 'assets/images/**.*', 8 | 'assets/**.js', 9 | ], 10 | modifyURLPrefix: { 11 | '_site/': '', 12 | }, 13 | runtimeCaching: [{ 14 | urlPattern: '/', 15 | handler: 'NetworkFirst', 16 | }], 17 | globDirectory: '_site', 18 | }; 19 | -------------------------------------------------------------------------------- /config/webpack.common.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | const path = require('path'); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 5 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 6 | const FaviconsWebpackPlugin = require('favicons-webpack-plugin'); 7 | 8 | module.exports = { 9 | entry: { 10 | app: './_src/index.js', 11 | }, 12 | plugins: [ 13 | new FaviconsWebpackPlugin({ 14 | logo: './icon.png', 15 | manifest: './config/manifest.json', 16 | }), 17 | new HtmlWebpackPlugin({ 18 | template: './_src/template/default.html', 19 | filename: '../_layouts/default.html', 20 | }), 21 | new MiniCssExtractPlugin(), 22 | new CopyWebpackPlugin({ 23 | patterns:[ 24 | { from: path.resolve('_images'), to: 'images/', } 25 | ] 26 | }), 27 | ], 28 | module: { 29 | rules: [ 30 | { 31 | test: /\.js$/, 32 | exclude: /(node_modules|bower_components)/, 33 | use: { 34 | loader: 'babel-loader', 35 | options: { 36 | presets: ['@babel/preset-env'], 37 | }, 38 | }, 39 | }, 40 | { 41 | test: /\.(css|scss)$/, 42 | use: [ 43 | MiniCssExtractPlugin.loader, 44 | { loader: 'css-loader', options: { importLoaders: 1, url: false } }, 45 | { 46 | loader: 'postcss-loader', 47 | options: { 48 | postcssOptions: { 49 | config: 'config/postcss.config.js', 50 | } 51 | }, 52 | }, 53 | { loader: 'sass-loader' }, 54 | ], 55 | }, 56 | { 57 | test: /\.(png|svg|jpg|gif)$/, 58 | use: [ 59 | 'file-loader', 60 | ], 61 | }, 62 | { 63 | test: /\.(woff|woff2|eot|ttf|otf)$/, 64 | use: [ 65 | 'file-loader', 66 | ], 67 | }, 68 | ], 69 | }, 70 | }; 71 | -------------------------------------------------------------------------------- /config/webpack.dev.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | const { merge: Merge } = require('webpack-merge'); 3 | const CommonConfig = require('./webpack.common.js'); 4 | const path = require('path'); 5 | const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); 6 | const webpack = require('webpack'); 7 | 8 | module.exports = Merge(CommonConfig, { 9 | output: { 10 | filename: '[name].bundle.js', 11 | path: path.resolve('assets'), 12 | publicPath: '/assets/', 13 | }, 14 | devtool: 'inline-source-map', 15 | plugins: [ 16 | new BrowserSyncPlugin( 17 | { 18 | host: 'localhost', 19 | port: 3000, 20 | proxy: 'http://localhost:8080', 21 | files: ['_site', '_src'], 22 | }, 23 | { 24 | reload: false, 25 | }, 26 | ), 27 | new webpack.HotModuleReplacementPlugin(), 28 | ], 29 | module: {}, 30 | devServer: { 31 | static: { 32 | directory: path.resolve('_site'), 33 | }, 34 | hot: true, 35 | client: { 36 | overlay: { 37 | errors: true, 38 | warnings: false, 39 | }, 40 | }, 41 | }, 42 | }); 43 | -------------------------------------------------------------------------------- /config/webpack.prod.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | const { merge: Merge } = require('webpack-merge'); 3 | const CommonConfig = require('./webpack.common.js'); 4 | const path = require('path'); 5 | const webpack = require('webpack'); 6 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 7 | const ImageminPlugin = require('imagemin-webpack-plugin').default; 8 | const TerserPlugin = require("terser-webpack-plugin"); 9 | 10 | module.exports = Merge(CommonConfig, { 11 | output: { 12 | filename: '[name]-[hash].bundle.js', 13 | path: path.resolve('assets'), 14 | publicPath: '/assets/', 15 | }, 16 | optimization: { 17 | minimize: true, 18 | minimizer: [new TerserPlugin({ 19 | terserOptions: { 20 | keep_fnames: true 21 | } 22 | })] 23 | }, 24 | plugins: [ 25 | new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: ['assets'], verbose: true }), 26 | new webpack.LoaderOptionsPlugin({ 27 | minimize: true, 28 | debug: false, 29 | }), 30 | new ImageminPlugin({ test: /\.(jpe?g|png|gif|svg)$/i }), 31 | ], 32 | }); 33 | -------------------------------------------------------------------------------- /config/webpack.pwa.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-extraneous-dependencies */ 2 | const { merge: Merge } = require('webpack-merge'); 3 | const ProdConfig = require('./webpack.prod.js'); 4 | const path = require('path'); 5 | 6 | module.exports = Merge(ProdConfig, {}); 7 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandoche/Jekyll-webpack-boilerplate/3e64586ac731d57e5e7ece7338b1bada88a5e39e/icon.png -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # You don't need to edit this file, it's empty on purpose. 3 | # Edit theme's home layout instead if you wanna make some changes 4 | # See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults 5 | layout: home 6 | --- 7 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "_site/" 3 | command = "npm run build:pwa" -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jekyll-webpack-boilerplate", 3 | "version": "1.0.0", 4 | "description": "A boilerplate with Jekyll and Webpack to make the most performant static websites", 5 | "main": "src/index.js", 6 | "repository": "git@github.com:sandoche/Jekyll-webpack-boilerplate.git", 7 | "author": "Sandoche Adittane ", 8 | "license": "MIT", 9 | "scripts": { 10 | "start": "npm run-script clean:project && webpack --env config=dev --progress --profile --color && concurrently \"webpack-dev-server --env config=dev\" \"bundle exec jekyll serve\"", 11 | "build": "npm run-script clean:project && cross-env NODE_ENV=production webpack --env config=prod --progress --profile --color && cross-env JEKYLL_ENV=production bundle exec jekyll build", 12 | "build:pwa": "npm run-script clean:project && cross-env NODE_ENV=production webpack --env config=pwa --progress --profile --color && cross-env JEKYLL_ENV=pwa bundle exec jekyll build && workbox generateSW config/sw.config.js --verbose", 13 | "serve:dist": "http-server _site", 14 | "clean:project": "rimraf ./_site ./assets" 15 | }, 16 | "devDependencies": { 17 | "@babel/core": "^7.15.5", 18 | "@babel/preset-env": "^7.15.6", 19 | "autoprefixer": "^10.3.6", 20 | "babel-loader": "^8.2.2", 21 | "browser-sync": "^2.18.13", 22 | "browser-sync-webpack-plugin": "^2.3.0", 23 | "clean-webpack-plugin": "^4.0.0", 24 | "concurrently": "^6.2.2", 25 | "copy-webpack-plugin": "^9.0.1", 26 | "cross-env": "^7.0.3", 27 | "css-loader": "^6.3.0", 28 | "cssnano": "^5.0.8", 29 | "eslint": "^7.32.0", 30 | "eslint-config-airbnb-base": "^14.2.1", 31 | "eslint-loader": "^4.0.2", 32 | "eslint-plugin-import": "^2.7.0", 33 | "favicons": "^6.2.2", 34 | "favicons-webpack-plugin": "^5.0.2", 35 | "file-loader": "^6.2.0", 36 | "html-webpack-plugin": "^5.3.2", 37 | "http-server": "^13.0.2", 38 | "imagemin-webpack-plugin": "^2.1.5", 39 | "mini-css-extract-plugin": "^2.3.0", 40 | "node-sass": "^6.0.1", 41 | "postcss-import": "^14.0.2", 42 | "postcss-loader": "^6.1.1", 43 | "postcss-scss": "^4.0.1", 44 | "rimraf": "^3.0.2", 45 | "sass-loader": "^12.1.0", 46 | "style-loader": "^3.3.0", 47 | "webpack": "^5.55.1", 48 | "webpack-cli": "^4.8.0", 49 | "webpack-dev-server": "^4.3.0", 50 | "webpack-merge": "^5.8.0", 51 | "workbox-cli": "^6.3.0" 52 | }, 53 | "dependencies": { 54 | "normalize.css": "^8.0.1" 55 | } 56 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function getWebpackConfig(env) { 2 | // eslint-disable-next-line global-require, import/no-dynamic-require 3 | return require(`./config/webpack.${env.config}.js`); 4 | }; --------------------------------------------------------------------------------