react-magic-form
v0.9.7
Published
Boilerplate for Resact with Typescript with rollup.js (not webpack)
Downloads
6
Maintainers
Readme
react-library-rollup
Boilerplate for Resact with Typescript with rollup.js (not webpack)
peerDependencies:
Nel package.json
la voce peerDependencies
indica che il nostro bundle (libreria) ha bisogno delle seguenti dipendenze per poter funzionare. Il caso d'uso d'esempio (e di questo caso) e per lo sviluppo di plugin.
Essendo un plugin React la "peerDependencie" sarà React (versione 16 o 17)
Rollup.js
Rollup.js vs Webpack:
Rollup.js è un alternativa a Webpack (entrambi module bundle) la principale differenza che Rollup.js ha il "Node polifilly" per import
o export
.
webpack e Rollup richiedono entrambi un file di configurazione che specifichi voce, output, caricatori, plug-in, trasformazioni, ecc. Tuttavia, c'è una leggera differenza:
- Il rollup ha polyfill di nodi per l'importazione / esportazione, ma il webpack no.
- Il rollup supporta i percorsi relativi in config, ma il webpack no, motivo per cui utilizzi path.resolve o path.join.
Dipendenze e configurazione:
Le principali dipendenze per poter usare Rollup.js in modo da poter trasformare React TS in Javascript in vari moduli: UMD, CommoJS, ESNext.
Pacchetti core:
- Core-js. More info
@babel/core
e@babel/plugin-transform-runtime
- Transpiler core- Rollup.js con le seguenti estensioni: plugin-commonjs, plugin-node-resolver, plugin-replace
File di configurazione di Rollup:
Rollup.js si basa sui files di configurazione contenuti nella cartella ./scripts/rollup
.
Per maggiori info sulle varie esportazioni javascript
rollup.config.js
- Configurazione per esportare in : cjs, amd, umd.createRollupConfig.js
- Funzione che genera la dist alla quale passo l'oggetto di config definito nel file al punto 1.
Esistono altre due file di configurazione per Inernet Explorer 11 (con relativo file tsconfig.ie11.json) e per ESM (Ecma Standard Module, import - export).
Linter + Github
Prettier & Eslint:
Per una correta formattazione e sintassi del codice si userà prettier
e eslint
. Entrmambi hanno il file di configurazione e diversi plugin. Nello specifico i plugin usati sono:
@typescript-eslint/eslint-plugin
&@typescript-eslint/parser
eslint-config-prettier
Disattiva tutte le regole non necessarie o che potrebbero entrare in conflitto con Prettier. Nota che questa configurazione disattiva solo le regole, quindi ha senso usarla solo insieme a qualche altra configurazione.eslint-plugin-cypress
- Supporto alla libreria di test Cypresseslint-plugin-prettier
- Da usare perforza con il punto 2. Quando la formattazione non "matcha" segnala i problemi come singoli problemi eslint.eslint-plugin-react
- Rules preset for Reacteslint-plugin-react-hooks
- React rule extension for hooks
NB: Nelle regole di eslint sono ammessi tutti i tipi di console(error, warn, log). In fase di compilazione (per la prod) i console.log()
vengino strippati.
Github - Husky & Staged:
Grazie a una combo di husky
e lint-staged
il codice deve ad ogni commit viene controllato e lintato (fix) prima di fare un commit.
Entrambe queste estensioni non hanno file di configurazione ma vegono configurati nel package.json
Utility
Elenco di script e pacchetti utility per lo sviluppo e mantenimento della repo.
npm run package:check
, controlla la qualità del package (skypack/package-check).npm run bundlesize
- Esegue una build e controlla la grandezza rispetto alla configurazione. La configurazione viene definita nel package.jsonnpm run clean
- Pulisco la cartella dist
Scripts
Elenco degli scripts disponibili in NPM:
npm run bundlesize
- Esegue la build e il controllo del peso secondo i parametri definiti nel package.check:package
- Controlla il contenuto e la sintassi del package.jsonnpm run cp:dts
- Usando il pacchetto copyfiles copio i tipi Typescript del pluginnpm run dev
- Avvia lo sviluppo con storybooknpm run test
- Esegue i testnpm run build
- Crea direttamenta attraverso Rollup.js la build del progetto in vari formati js (CommoJs, umd, esnext)npm run prepublishOnly
- Crea al build per la pubblicazione, quindi prima esegue controlli con il linter, avvia i test e poi crea la build.npm run lint
- Controlla errori di sintatti e di formanpm run lint:fix
- Risolve, dove possibile, eventuali errori di sintatti o forma
Build
La build è una transpilazione da Typescript a ES5 nei seguenti formati:
- CommonJs - Sviluppo e produzione
- ESM - Sviluppo e produzione
- UMD - Sviluppo e produzione
- ie11 - Sviluppo e produione
Vengono inoltre clonati tutti i Types
di Typescript.
I tipi all'interno del src
devono essere collocati nella cartella /src/types/
Inoltre è possibile attraverso il comando npm run check:package
creare un build e controllarne il peso rispetto a quello massimo impostto.
Testing
NB: Enzyme non ha ancora rilasciato Adapter()
ufficiale per la versione 17 di React.
Quindi il progtto è stato "wongraded" alla versione di React e React Dom React 16.14.0
.
Per i test verrà usata il solito Jest
e Cypress
Visita il sito.
e2e Cypress: Ho deciso di integrare per la maggior parte test e2e e non unit test t1ramite Cypress.
I test di Cypress vengono assegnati tramite URL. Quindi è necessario compilare e avviare il plugin nel browser.
Quindi è necessaria una configurazione TS per integrare la libreria compilata in "componenti esempio" e avviarli.
Tutta la configurazione per l'app di test e2e si trova nella folder ./app
.
Per testare l'integrazione della library come "pacchetto" import * from 'react-magic-form';
esiste un comando
JEST + ENZYME:
Jest è stato integrato con Enzyme. Pensavo fossero più easy, ma essendo complesso il plugin i tes non sono immediati per un noob. Studiare e partire facendo "UNIT TEST" base. Anche vero che per l'esigenze del progetto e pe un fattore tempo i test migliori sono quelli e2e.
BYPASS LINT X GIT:
Dal package.json rimuovere la sezione relativa a husky
"husky": { "hooks": { "pre-commit": "npm run lint:fix && npm run lint" } }, "lint-staged": { ".{js,ts,tsx}": [ "npm run lint:fix" ], ".{md,json,yml}": [ "prettier --write" ] }