Figyelem: ha bármit parancssorba másolunk copy-paste megoldással, akkor a parancssorban vagy a fejlesztői felület fájljában a ” és a – és a −− karatkereket írjuk újra át kézzel a saját billentyűzetről, különben valamilyen karakterkódolási probléma miatt hibára futunk!
Modul: ha egy utasítássorozat többször is előfordul egy programban, akkor azt a kódrészletet egy külön fájlba szervezzük ki, amely minden más fájl számára hozzáférhető lesz a megfelelő kulcsszavak használatával. A modul tehát egy külön fájlba elhelyezett kódrészlet. Ezeket a modulokat lehet exportálni és importálni. Azaz egy modul több másik modult is importálhat.
Webpack: a webpack egy module bundler (bundle:csomag), amely a modulokból (itt modulnak számítanak a képek, CSS fájlok, JavaSript fájlok) és a feltelepített npm csomagokból egy bundle-t (csomagot) hoz létre. A webpack figyelembe veszi, hogy mi mit tölt be, így elkerüli a duplikációt, hiszen figyeli, hogy egy csomagot betöltöttünk-e már. A nem használt CSS és JavaScript kódokat is képes kezelni, így rövidebb kódot generál.
A használatához telepítve kell hogy legyen a node és az npm. Ellenőrzése parancssorból: node –version; npm –version;
mappa létrehozása; package.json létrehozása: npm init; ha nincs js fájl, akkor az index.js-t tekinti entry point-nak (package.json-ben „main” key); installálni kell: (itt bugos a WordPress: a parancssor nem tudja értelmezni az innen kimásolt ‐‐ jelet, ezért azt írjuk át a billenytűzetről a parancssorban: ‐‐save-dev) npm install ‐‐save-dev webpack webpack-cli webpack-dev-server copy-webpack-plugin css-loader style-loader; (webpack-cli: command line interface a webpack-hoz; webpack-dev-server: ez a webszerver szolgálja ki a fejlesztés idejére az alkalmazást;copy-webpack-plugin: a fájlokat másolja build időben; css-loader, style-loader: a css fájlok bekötéséhez szükséges); ha szeretném. akkor @-cal a verziószámot is megadhatom a függőségnél, pl. style-loader@1.2.1; a ‐‐save-dev kapcsoló: a devDependencies közé veszi fel a függőségeket; ennek annyiban nincs jelentősége, hogy a webpack csak azokat a kódokat tartja meg, amiket az applikáció fel is használ, de fejlesztői szempontból jó, ha látom, hogy mik azok a függőségek, amelyek csak a fejlesztéshez kellenek; az installálás során létrejön a node_modules mappa, ez tartalmazza a függőségeket;
npm install --save-dev webpack webpack-cli webpack-dev-server copy-webpack-plugin css-loader style-loader;
UPDATE (2021 09 01) valamelyik függőség új verziójával valami lehet, így az npm start futtatása hibára fog futni. Használhatjuk a fenti npm telepítések helyett a következő – régebbi verziókat tartalmazó – package.json-t, s így telepítjük a függőségeket az npm install paranccsal (viszont itt egy halom WARN deprecated figyelmeztetést kapunk):
{ "name": "idojaras2", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "start": "webpack serve", "build": "webpack --config webpack.config.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "copy-webpack-plugin": "^9.0.1", "css-loader": "^5.2.6", "file-loader": "^6.2.0", "loader": "^2.1.1", "sass": "^1.35.2", "sass-loader": "^12.1.0", "style": "0.0.3", "style-loader": "^3.0.0", "ttf-loader": "^1.0.2", "webpack": "^5.44.0", "webpack-cli": "^4.7.2", "webpack-dev-server": "^3.11.2" }, "dependencies": { "na92-card": "^1.0.0" } }
Az error jelzése ez lesz: options has an unknown property ‘contentBase’; Megoldása: contentBase was renamed to static, azaz a contentBase property-t át kell nevezni static-ra a webpack.config.js fájlban – erről a fájlról mindjárt szó lesz;
ha elküldjük zippelve az alkalmazást, akkor a node_modules mappát hagyjuk ki, a fogadó fél az npm install paranccsal tudja létrehozni a package.json file alapján;
fel kell venni a projekt gyökérmappájában egy webpack.config.js fájlt, ez fogja a webpack-et konfigurálni; (kézzel kell felvenni és kitölteni);
const path = require('path'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const DIST_DIR = path.resolve(__dirname, 'dist'); module.exports = { entry: './app.js', output: { path: DIST_DIR, filename: 'bundle.js' }, plugins: [ new CopyWebpackPlugin({ patterns: [ {from: './index.html', to: DIST_DIR} ] }) ], module: { rules: [ { test: /\.css$/i, use: [ "style-loader", "css-loader" ] }, ] }, devServer: { contentBase: DIST_DIR }, }
require: függvényhívás, lényegében import; a JS világban többféle import eljárás terjedt el, ezek közül egy a require; path.resolve: az aktuális mappához hozzáfűzi egy dist nevű mappát; DIST_DIR: ennek a dist mappának az elérési útvonala; module.export: ezt az objectet fogja a js fájl kiexportálni, ez lesz a webpack konfigurációja – ezt az objectet fogja a webpack feldolgozni; entry: az alkalmazás belépési pontja, innen indul el az importok sorozata, innen indulva építi ki a függőségek gráfját, itt dől el, hogy mik lesznek azok a függőségek, amelyek végül belefordulnak az itt meghatározott output-ba; output: a build folyamat kimenete, path: ebbe a mappába teszi a kimeneti fájlt; filename: ez lesz a kimeneti fálj, tetszőlegesen elnevezhető, értelemszerűen a dist mappában lesz; szokásos neve bundle.js plugin: a webpacken belül mindent pluginokkal oldunk meg; egy tömböt vár; több plugint is fel tudnánk sorolni; CopyWebpackPlugin: bizonyos fájlokat átmásol a dist mappába; ez azért van, mert az index.html fájlt sehol sem hivatkozzuk be az app.js fájlba, sehol máshol sem, egyszerűen csak azt szeretnénk, hogy ott legyen az alkalmazás gyökerében; module: a modulok, itt most a css-eket tölti be; test: milyen fájlnevekre egyezen a dolog, ezeket a nevű fájlokat akarjuk betölteni;devServer: futtassunk egy devszervert a lebuildelt alkalmazásból
A package.json „scripts” objectjébe két szkriptet kell felvenni: „start”: „webpack serve”, – ez egy webszervert hoz létre és futtatja az alkalmazást; ha közben átírjuk a kódot, akkor automatikusan újratölti; „build”: „webpack –config webpack.config.js”, – ez buildeli a webpack-et a webpack.config.js-nek megfelelően.
"scripts": { "start": "webpack serve", "build": "webpack --config webpack.config.js", "test": "echo \"Error: no test specified\" && exit 1" },
futtatásuk: mivel a start beépített npm-es életciklus: npm start vagy npm run-script start; egyéb script parancsok mindig npm run-script előtaggal, azaz build futtatása: npm run-script build; ekkor létre jön a dist mappában a bundle.js; npm start: elindul a szerver; kiírja a terminál: Project is running at http://localhost:8080/; az index.html-be be kell kötni a bundle.js fájlt:<script src=”bundle.js></script>; nem a relatív elérési utat írjuk be, csak a fájl nevet;
A böngészőben a http://localhost:8080/ oldalon egy figyelmeztetést kaphatunk, ezt le kell ikszelni.
Az app.js-be a css közvetlenül beimportálható: import ‘./styles.css’; de beköthetem az index.html-be is: <link rel=”stylesheet” href=”./styles.css”>; ekkor viszont a webpack.config.js fájlban a CopyWebpackPlugin patterns key-hez tartozó tömbben létre kell hozni a {from: ‘./styles.css’, to: DIST_DIR} objectet, hogy a styles.css fájl bemásolódjon a dist-be; ha pl. képet akarunk berakni az index.html-be, akkor az img mappát ugyanúgy be kell copyzni a dist-be: {from: ‘./img’, to: DIST_DIR};
fontok betöltése; Google fonts-ból index.html head-be: <link href=”https://fonts.googleapis.com/css2?family=Roboto&display=swap” rel=”stylesheet”>
Sass: Syntactically Awesome Style Sheets; fájlkiterjesztés: scss; styles.scss; bővebben: itt;
változók deklarálása:pl. $base-color: #c6538c;
nesting:
.form-container { form{display:flex;align-items:center} };
Parent Selector:
button {background:none; background-color:$secondary-color; color:#FFFFFF; &:hover{ color:white; background-color:#254014; } &:focus{ background-color: #3DFF4F; color: $font-color; } }
sass, sass-loader installálása: (itt bugos a WordPress: a parancssor nem tudja értelmezni az innen kimásolt ‐‐ jelet, ezért azt írjuk át a billenytűzetről a parancssorban: ‐‐save-dev) npm install ‐‐save-dev sass sass-loader; a devDependencies-be kerül, mert csak fejlesztési időben van rá szükség, a böngészők nem tudnak mit kezdeni a sass fájlokkal; sass: átfordítja a sass fájlokat css fájlokba; sass-loader betölti a sass fájlokat; a build folyamat css-t épít be a bundle-ba, így futásidőben már nincs szükség a sass-ra; test: /.s[ac]ss$/i – ez a sass és a scss fájlokra fog matchcselni; de írhatnánk ezt is helyette: test: /.scss$/i, ekkor csak az scss fájlokra matccsel; ha a styles.css fájlt átnevezzük styles.scss-re, elvileg maradhat benne az eredeti css nyelvű tartalom, a build folyamat azt is érteni fogja;
sass bekötése: webpack.config.js fájlban a module object rules tömbjébe elhelyezni; továbbá app.js-ben: import ‘./styles.scss’
{ //test: /\.css$/i, test: /\.s[ac]ss$/i, use: [ "style-loader", "css-loader", "sass-loader" ] },
documentáció: https://webpack.js.org/loaders/sass-loader/
.gitignore fájl: mit ne töltsön fel a gitre:
verziószám: main.minor.patch; package.json: 1;Patch releases: 1.0
or 1.0.x
or ~1.0.4
; Minor releases: 1
or 1.x
or ^1.0.4
; Major releases: *
or x
; függőségek telepítése package.json megkötései szerint: npm install; a package-lock.json a használt verzió pontos verziószámát tartalmazza, ha ezen verziószámok szerint akarjuk telepíteni a függőségeket (hogy ne vegye figyelembe az esetleges függőségeket), akkor: npm ci
bootstrap elhelyezése: letöltés a mode_nodulesbe: npm install bootstrap; bekötés: a style.scss-be @import: ‘~bootstrap’; a tilde a node_modulesre mutat, ott fogja keresni a könyvtárat;