{"id":27727,"date":"2020-01-08T00:00:00","date_gmt":"2020-01-07T23:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=27727"},"modified":"2021-01-13T09:40:17","modified_gmt":"2021-01-13T08:40:17","slug":"creare-librerie-di-componenti-angular","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/","title":{"rendered":"Creare librerie di componenti Angular"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"27728\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image00-15\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image00-15\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-27728\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Capita spesso di dover risolvere un problema gi\u00e0 risolto in un progetto precedente con un classico copia e incolla del codice. Tale approccio, ovviamente, fornisce una soluzione rapida al problema, ma pu\u00f2 innescare una serie di effetti collaterali, tra cui il peggiore di tutti \u00e8 sicuramente scoprire la presenza di un bug e doverlo correggere in tutti i progetti in cui abbiamo copiato il codice. E se poi volessi aggiungere una nuova funzionalit\u00e0? Dovr\u00f2 propagarla ovunque?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nei progetti Angular su cui ho lavorato, \u00e8 sempre stato necessario creare un componente che fosse in grado di prendere dei dati e mostrarli in forma tabulare. Perch\u00e9 non rendere questo componente riutilizzabile in pi\u00f9 progetti? Angular offre questa possibilit\u00e0 con le&nbsp;<strong>Angular Library<\/strong>. Nell\u2019<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Gestire-il-Drag--Drop-in-Angular-54\" target=\"_blank\" rel=\"noreferrer noopener\">articolo precedente&nbsp;<\/a>, ho mostrato come creare un componente che visualizzi dei dati in forma tabellare, e permetta il drag and drop delle colonne: rendiamo questo componente riutilizzabile in tutti i nostri progetti creando una libreria!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dalla&nbsp;<strong>CLI<\/strong>&nbsp;di Angular lanciamo i seguenti comandi:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng new BlexinLibrary<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In merito alla creazione di una libreria, la documentazione ufficiale di Angular ci dice di impostare il flag&nbsp;<code>--create-application<\/code>&nbsp;a false per indicare alla CLI che non deve creare un\u2019applicazione iniziale ma semplicemente un workspace vuoto. Non \u00e8 per\u00f2 la soluzione che ho scelto e che preferisco, perch\u00e9 diventa poi difficile fare il debug della libreria.<br>Quello che invece vi consiglio, \u00e8 creare una classica applicazione Angular che vi faccia da host e al suo interno sviluppare la libreria: in questo modo potrete testarla prima di effettuarne il rilascio. Nella cartella radice del progetto, lanciamo il comando per creare la libreria:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng generate library DataTable<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"666\" data-attachment-id=\"27733\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image01-11\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-11.png?fit=474%2C666&amp;ssl=1\" data-orig-size=\"474,666\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image01-11\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-11.png?fit=474%2C666&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-11.png?resize=474%2C666&#038;ssl=1\" alt=\"\" class=\"wp-image-27733\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-11.png?w=474&amp;ssl=1 474w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image01-11.png?resize=214%2C300&amp;ssl=1 214w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Notiamo che l\u2019Angular CLI ha creato una cartella projects con, al suo interno, una cartella col nome della libreria (DataTable). Nella sottocartella data-table\/src, troviamo una cartella\u00a0<em>lib<\/em>\u00a0che conterr\u00e0 i file che compongono il progetto (componenti, servizi, moduli, etc), pi\u00f9 un file public-api.ts che dichiarer\u00e0 cosa vogliamo rendere disponibile agli utilizzatori della nostra libreria.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\/*\n* Public API Surface of data-table\n*\/\n  \nexport * from &#039;.\/lib\/data-table.service&#039;;\nexport * from &#039;.\/lib\/data-table.component&#039;;\nexport * from &#039;.\/lib\/data-table.module&#039;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Scopriamo cos\u00ec che nella libreria \u00e8 gi\u00e0 stato creato un component, un service e un modulo. Il file di configurazione dell\u2019intero workspace,\u00a0<strong>angular.json<\/strong>, viene aggiornato con un nuovo progetto di tipo\u00a0<strong>library<\/strong>\u00a0che ha il nome scelto durante la creazione della libreria.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n\u00a0&quot;$schema&quot;: &quot;.\/node_modules\/@angular\/cli\/lib\/config\/schema.json&quot;,\n\u00a0&quot;version&quot;: 1,\n\u00a0&quot;newProjectRoot&quot;: &quot;projects&quot;,\n\u00a0&quot;projects&quot;: {\n\u00a0\u00a0\u00a0&quot;BlexinLibrary&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;root&quot;: &quot;&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;sourceRoot&quot;: &quot;src&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;projectType&quot;: &quot;application&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;prefix&quot;: &quot;app&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0...\n\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0&quot;BlexinLibrary-e2e&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;root&quot;: &quot;e2e\/&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;projectType&quot;: &quot;application&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;prefix&quot;: &quot;&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0...\n\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0&quot;DataTable&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;root&quot;: &quot;projects\/data-table&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;sourceRoot&quot;: &quot;projects\/data-table\/src&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;projectType&quot;: &quot;library&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;prefix&quot;: &quot;lib&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;architect&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;build&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;builder&quot;: &quot;@angular-devkit\/build-ng-packagr:build&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;options&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;tsConfig&quot;: &quot;projects\/data-table\/tsconfig.lib.json&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;project&quot;: &quot;projects\/data-table\/ng-package.json&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A questo punto, procediamo scrivendo codice come in un progetto Angular standard. Prendendo spunto dal mio&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Gestire-il-Drag--Drop-in-Angular-54\" target=\"_blank\" rel=\"noreferrer noopener\">articolo precedente&nbsp;<\/a>, eliminiamo i file che ci ha creato la CLI lasciando&nbsp;<em><strong>data-table.component.ts<\/strong><\/em>&nbsp;e&nbsp;<em><strong>data-table.module.ts<\/strong><\/em>, e passiamo alla costruzione del component.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019articolo precedente, la tabella non era un componente a s\u00e9 ma faceva parte dell\u2019app.component: quindi, un passaggio obbligatorio \u00e8 quello di estrarre il component data-table dall\u2019app.component.<br>Osservando il template, ci accorgiamo che data-table opera fondamentalmente su due strutture dati:<strong>\u00a0columns<\/strong>\u00a0e\u00a0<strong>rows<\/strong>. Queste due strutture dati devono esserci fornite da chi utilizza la libreria, diventando quindi i nostri\u00a0<strong>Input<\/strong>. Il file .ts del nostro component sar\u00e0 il seguente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nimport { Component, Input } from &#039;@angular\/core&#039;;\n  \n@Component({\n selector: &#039;blx-data-table&#039;,\n templateUrl: &#039;.\/data-table.component.html&#039;,\n styleUrls: &#x5B;&#039;.\/data-table.component.css&#039;]\n})\nexport class DataTableComponent {\n @Input() columns: string&#x5B;];\n @Input() rows: any&#x5B;];\n  \n constructor() { }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Modifichiamo il selettore da\u00a0<strong>lib-DataTable<\/strong>\u00a0a<strong>\u00a0blx-data-table<\/strong>, andando anche a modificare il prefix nel file tslint.json:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n{\n\u00a0&quot;extends&quot;: &quot;..\/..\/tslint.json&quot;,\n\u00a0&quot;rules&quot;: {\n\u00a0\u00a0\u00a0&quot;directive-selector&quot;: &#x5B;\n\u00a0\u00a0\u00a0\u00a0\u00a0true,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;attribute&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;blx&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;camelCase&quot;\n\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0&quot;component-selector&quot;: &#x5B;\n\u00a0\u00a0\u00a0\u00a0\u00a0true,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;element&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;blx&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;kebab-case&quot;\n\u00a0\u00a0\u00a0]\n\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Di seguito potete vedere anche il template del nostro componente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;p-5 m-5&quot;&gt;\n\u00a0&lt;div class=&quot;p-5 m-5&quot;&gt;\n\u00a0&lt;div class=&quot;table-responsive table-container&quot;&gt;\n\u00a0\u00a0\u00a0&lt;table class=&quot;table&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0&lt;thead class=&quot;thead-dark&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;tr dragula=&quot;table_columns&quot; &#x5B;(dragulaModel)]=&quot;columns&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;th *ngFor=&quot;let column of columns&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{{column}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/th&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/tr&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/thead&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0&lt;tbody&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;tr *ngFor=&quot;let row of rows&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;td *ngFor=&quot;let column of columns&quot;&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{{row&#x5B;column]}}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/td&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/tr&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/tbody&gt;\n\u00a0\u00a0\u00a0&lt;\/table&gt;\n\u00a0&lt;\/div&gt;\n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La libreria esterna che stiamo utilizzando per il drag&amp;drop necessita di alcune classi CSS, per poter mostrare l\u2019effetto desiderato. Nel progetto precedente, avevo messe queste classi nello&nbsp;<strong>style.css<\/strong>. Ora, per\u00f2, non voglio che chi importa la libreria debba preoccuparsi di aggiungere tali classi al suo progetto: devono gi\u00e0 essere presenti nella libreria stessa.<br>Le includiamo quindi nel file&nbsp;<strong>data-table.component.css<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come gi\u00e0 detto, il file\u00a0<strong>public_api.ts<\/strong>\u00a0permette di definire ci\u00f2 che i nostri utilizzatori vedranno della libreria. Andiamo quindi a modificarlo, per tener conto della cancellazione del service:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nexport * from &#039;.\/lib\/data-table.component&#039;;\nexport * from &#039;.\/lib\/data-table.module&#039;;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il componente\u00a0<strong>data-table<\/strong>\u00a0necessita di alcune dipendenze esterne:\u00a0<code>ng2-dragula<\/code>\u00a0(gestione drag&amp;drop) e\u00a0<code>bootstrap<\/code>\u00a0(classi CSS). \u00c8 necessario, quindi, comunicare a chi installa la libreria che, per il corretto funzionamento, ha bisogno di aggiungere al proprio progetto tali dipendenze. Modifichiamo quindi il file\u00a0<strong>package.json<\/strong>\u00a0della cartella data-table, aggiungendole alla sezione\u00a0<em><strong>peerDependencies<\/strong><\/em>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n{\n\u00a0&quot;name&quot;: &quot;data-table&quot;,\n\u00a0&quot;version&quot;: &quot;0.0.1&quot;,\n\u00a0&quot;peerDependencies&quot;: {\n\u00a0\u00a0\u00a0&quot;@angular\/common&quot;: &quot;^7.0.0&quot;,\n\u00a0\u00a0\u00a0&quot;@angular\/core&quot;: &quot;^7.0.0&quot;,\n\u00a0\u00a0\u00a0&quot;bootstrap&quot;: &quot;^4.3.1&quot;,\n\u00a0\u00a0\u00a0&quot;ng2-dragula&quot;: &quot;^2.1.1&quot;\n\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Prima della pubblicazione, dobbiamo assicurarci che il tutto funzioni correttamente. La scelta iniziale di creare un progetto Angular, e non un workspace vuoto, ora ci d\u00e0 un enorme vantaggio: per poter testare la libreria \u00e8 sufficiente importarne il modulo nel nostro app.module e utilizzare il component mediante il selettore. Ecco come diventa il nostro\u00a0<strong>app.component.html<\/strong>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div style=&quot;text-align:center&quot;&gt;\n\u00a0&lt;h1&gt;\n\u00a0\u00a0\u00a0Welcome to {{ title }}!\n\u00a0&lt;\/h1&gt;\n&lt;\/div&gt;\n&lt;blx-data-table &#x5B;columns]=&quot;columns&quot; &#x5B;rows]=&quot;rows&quot;&gt;&lt;\/blx-data-table&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">dove column e row vengono definite in<em><strong>\u00a0app.component.ts<\/strong><\/em>\u00a0e poi passate in input al\u00a0<strong>data-table<\/strong>. Prima di poter lanciare la nostra applicazione, occorre installare le due dipendenze della nostra libreria (con le istruzioni\u00a0<code>npm install ng2-dragula<\/code>\u00a0e\u00a0<code>npm install bootstrap<\/code>), aggiungere\u00a0<code>\"node_modules\/bootstrap\/dist\/css\/bootstrap.css\"<\/code>\u00a0tra gli style del nostro\u00a0<strong>angular.json<\/strong>\u00a0ed infine aggiungere\u00a0<code>(window as any).global = window;<\/code>\u00a0nel file\u00a0<strong>polyfills.ts<\/strong>\u00a0come suggerito nella documentazione di Dragula.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lanciamo quindi l\u2019applicazione con il classico\u00a0<code>ng serve<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"376\" data-attachment-id=\"27738\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image02-10\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-10.png?fit=2612%2C958&amp;ssl=1\" data-orig-size=\"2612,958\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image02-10\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-10.png?fit=1024%2C376&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-10.png?resize=1024%2C376&#038;ssl=1\" alt=\"\" class=\"wp-image-27738\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-10-980x359.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-10-480x176.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Verificato che tutto funziona, possiamo distribuirla. Compiliamo la libreria, aggiungendo al solito comando di build il nome della libreria:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng build DataTable<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A fine compilazione, la libreria sar\u00e0 disponibile nella cartella dist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Come utilizzare la libreria appena creata<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo due possibilit\u00e0: importarla in un nuovo progetto prelevandola dal suo folder dist oppure renderla disponibile assieme ai suoi aggiornamenti utilizzando lo stesso ecosistema scelto da Angular: npm.<br>Creiamo un nuovo progetto Angular:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ng new demo-with-lib<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All\u2019interno della struttura del progetto appena creato, andiamo a creare una nuova cartella&nbsp;<em>lib<\/em>&nbsp;dove copiamo la cartella contenente il risultato della build della libreria. Posso quindi installarla con il comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>npm i .\/libs\/data-table<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aggiungiamo anche le dipendenze necessarie al suo corretto funzionamento ed importiamo il modulo\u00a0<code>DataTableModule<\/code>\u00a0nel\u00a0<em>app.module.ts<\/em>\u00a0per poter utilizzare il component esposto.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nimport { BrowserModule } from &#039;@angular\/platform-browser&#039;;\nimport { NgModule } from &#039;@angular\/core&#039;;\nimport { DataTableModule } from &#039;data-table&#039;;\nimport { AppComponent } from &#039;.\/app.component&#039;;\n\u00a0\u00a0\n@NgModule({\n\u00a0declarations: &#x5B;\n\u00a0\u00a0\u00a0AppComponent\n\u00a0],\n\u00a0imports: &#x5B;\n\u00a0\u00a0\u00a0BrowserModule,\n\u00a0\u00a0\u00a0DataTableModule\n\u00a0],\n\u00a0providers: &#x5B;],\n\u00a0bootstrap: &#x5B;AppComponent]\n})\nexport class AppModule { }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Posizioniamo il componente con l\u2019opportuno tag\u00a0<code>blx-data-table<\/code>\u00a0nel\u00a0<em>app.component.ts<\/em>, fornendo gli Input attesi:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;text-center&quot;&gt;\n\u00a0&lt;h1&gt;\n\u00a0\u00a0\u00a0Welcome to {{ title }}!\n\u00a0&lt;\/h1&gt;\n&lt;\/div&gt;\n&lt;blx-data-table &#x5B;columns]=&quot;columns&quot; &#x5B;rows]=&quot;rows&quot;&gt; &lt;\/blx-data-table&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Lanciamo l\u2019applicazione e verifichiamo il corretto funzionamento.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"376\" data-attachment-id=\"27741\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image02-1-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-1-1.png?fit=2612%2C958&amp;ssl=1\" data-orig-size=\"2612,958\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image02-1-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-1-1.png?fit=1024%2C376&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-1-1.png?resize=1024%2C376&#038;ssl=1\" alt=\"\" class=\"wp-image-27741\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-1-1-980x359.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image02-1-1-480x176.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo fatto dei progressi, nel senso che possiamo riutilizzare il componente ovunque vogliamo. In realt\u00e0, abbiamo di nuovo fatto ricorso a un copia e incolla: non pi\u00f9 del codice sorgente ma del folder di distribuzione della libreria. E se volessimo permettere ad altri elementi del team di utilizzare la libreria, fornendo uno strumento semplice per seguire i suoi aggiornamenti? E se volessi renderla pubblica, ossia permettere a chiunque nel mondo di installarla tramite npm?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All\u2019indirizzo&nbsp;<a href=\"https:\/\/docs.npmjs.com\/creating-and-publishing-private-packages\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.npmjs.com\/creating-and-publishing-private-packages&nbsp;<\/a>, \u00e8 disponibile il tutorial ufficiale per pubblicare un package sul registy pubblico npm. Seguiamo invece una strada diversa, offerta da qualche mese a questa parte da Github.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub offre la possibilit\u00e0, mediante&nbsp;<strong>GitHub Packages<\/strong>, di creare un proprio repository, dove pubblicare e distribuire la propria libreria in maniera privata con il proprio team oppure pubblica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pubblicare su GitHub Packages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per poter pubblicare, installare ed eventualmente eliminare un package da GitHub Packages \u00e8 necessario disporre di un access token. Ci sono due strade per ottenerne uno: utilizzando l\u2019Access Token personale con la propria username per autenticarsi su GitHub, oppure utilizzando un GITHUB_TOKEN per autenticarsi su GitHub Actions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho scelto la strada dell\u2019access token personale. Occorre quindi modificare il file&nbsp;<em><strong>~\/.npmrc<\/strong><\/em>&nbsp;ed includere la seguente riga:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/\/npm.pkg.github.com\/:_authToken=TOKEN<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sostituendo \u201cTOKEN\u201d con il proprio token.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto, occorre creare il file&nbsp;<em><strong>.npmrc<\/strong><\/em>&nbsp;nella stessa cartella dove \u00e8 presente il package.json, nella quale inserire la seguente riga:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>registry=https:\/\/npm.pkg.github.com\/OWNER<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dove OWNER \u00e8 il nome dell\u2019account Git del repo. Aggiungiamo lo stesso file anche sul repo e controlliamo che nel package.json sia specificato il nome del pacchetto, la versione e il repo dove risiede il codice sorgente.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n{\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;name&quot;: &quot;@accountgit\/packagename&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;version&quot;: &quot;2.0.1&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;peerDependencies&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;@angular\/common&quot;: &quot;^8.2.14&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;@angular\/core&quot;: &quot;^8.2.14&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;bootstrap&quot;: &quot;^4.3.1&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;ng2-dragula&quot;: &quot;^2.1.1&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\n\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0&quot;repository&quot;: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;type&quot;: &quot;git&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;url&quot;: &quot;git+https:\/\/github.com\/accountgit\/reponame.git&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo pubblicarlo con il comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>$ npm publish<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"237\" data-attachment-id=\"27744\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image03-9\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image03-9.png?fit=1518%2C351&amp;ssl=1\" data-orig-size=\"1518,351\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image03-9\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image03-9.png?fit=1024%2C237&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image03-9.png?resize=1024%2C237&#038;ssl=1\" alt=\"\" class=\"wp-image-27744\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image03-9-980x227.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image03-9-480x111.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A seguito della pubblicazione, nel nostro repository troviamo popolata la sezione package che ci porta a una sezione pi\u00f9 dettagliata su quanto \u00e8 stato pubblicato.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"362\" data-attachment-id=\"27747\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/attachment\/image04-10\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-10.png?fit=1582%2C559&amp;ssl=1\" data-orig-size=\"1582,559\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image04-10\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-10.png?fit=1024%2C362&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-10.png?resize=1024%2C362&#038;ssl=1\" alt=\"\" class=\"wp-image-27747\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-10-980x346.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image04-10-480x170.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Come modificare la libreria<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Come possiamo gestire il normale ciclo di vita della nostra libreria? La correzione dei bug, l\u2019aggiunta di una nuova feature, una modifica sostanziale che la renda incompatibile con le versioni precedenti? Tutto ci\u00f2, consentendo a tutti quelli che hanno installato la libreria di aggiornare il pacchetto nei propri progetti in maniera sicura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 il momento di gestire il versionamento della mia libreria. Nel package.json troviamo il campo&nbsp;<strong>version<\/strong>, che definisce la versione attuale della libreria. Utilizzando Semantic Version, possiamo rendere chiaro a chi utilizza la nostra libreria quali versioni del nostro pacchetto pu\u00f2 installare in maniera sicura, ovvero senza la necessit\u00e0 di dover apportare modifiche al proprio codice per integrare la nostra libreria.<br>In questo modo, il campo version conterr\u00e0 una stringa formattata nel modo seguente: \u201c<strong>major.minor.patch<\/strong>\u201d, in cui ogni blocco corrisponde ad un numero intero non negativo. Vi rimando all\u2019&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Versionare-i-pacchetti-Nuget-con-GitFlow-e-SemVer-41\" target=\"_blank\" rel=\"noreferrer noopener\">articolo di Antonio<\/a>&nbsp;per una spiegazione dettagliata<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tornando alla nostra modifica: per la risoluzione dei bug occorrer\u00e0 quindi modificare la&nbsp;<em>patch<\/em>&nbsp;del nostro numero di versione, incrementando di uno. Allo stesso modo, dopo aver aggiunto una nuova funzionalit\u00e0 che sia compatibile con il codice attuale, occorrer\u00e0 aggiornare&nbsp;<em>minor<\/em>&nbsp;incrementando di uno.&nbsp;<em>Major<\/em>&nbsp;sar\u00e0 incrementato quando verranno apportate delle modifiche che impattano sull\u2019API, come ad esempio, nel nostro caso, la modifica di un nome di una propriet\u00e0 di INPUT. Terminate le modifiche, possiamo pubblicare il pacchetto aggiornato con lo stesso comando utilizzato in precedenza&nbsp;<code>$ npm publish<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per i client che utilizzano la nostra libreria, a seguito del comando&nbsp;<code>npm install<\/code>, l\u2019aggiornamento della stessa (ottenuto lanciando il comando&nbsp;<code>npm update<\/code>)dipende dalla configurazione della dipendenza nel package.json.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ci sono due possibili configurazioni<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>\u201cnome_del_pacchetto\u201d: \u201c~major.minor.patch\u201d<\/strong><\/li><li><strong>\u201cnome_del_pacchetto\u201d: \u201c^major.minor.patch\u201d<\/strong><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nel primo caso, verr\u00e0 scaricato il pacchetto che ha lo stesso major e minor ma con l\u2019ultima versione di patch disponibile. Nel secondo caso, invece, verr\u00e0 scaricato il pacchetto che ha lo stesso major ma con l\u2019ultima versione di minor e patch disponibile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con l\u2019utilizzo della&nbsp;<strong>tilde(~)<\/strong>&nbsp;stiamo quindi indicando di mantenere il nostro pacchetto a meno di bug fix, mentre utilizzando il<strong>&nbsp;caret(^)<\/strong>&nbsp;indichiamo la volont\u00e0 di aggiornare il pacchetto anche in caso di aggiunta di nuove funzionalit\u00e0 compatibili con la versione attualmente installata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Notate che, se non \u00e8 stato ancora installato il pacchetto,&nbsp;<code>npm install<\/code>&nbsp;avr\u00e0 lo stesso effetto di&nbsp;<code>npm update<\/code>, ovvero quello di andare a trovare il pacchetto pi\u00f9 aggiornato in base alle direttive date nel package.json. Il discorso cambia, se gi\u00e0 sono stati installati pacchetti in locale: in quel caso non \u00e8 sufficiente&nbsp;<code>npm install<\/code>&nbsp;per aggiornare il pacchetto, perch\u00e9 quello trovato in locale rispetta gi\u00e0 le direttive date, va quindi utilizzato&nbsp;<code>npm update<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 possibile, infine, specificare che si vuole installare l\u2019ultima versione disponibile indipendentemente da quella installata con il comando&nbsp;<code>$ npm install packagename@latest \u2013save<\/code><br>In questo modo, verr\u00e0 aggiornato anche il package.json con il numero di versione del pacchetto scaricato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019intero codice \u00e8 su github al seguente indirizzo:\u00a0<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/AARNOLD87\/AngularLibrary\" target=\"_blank\">https:\/\/github.com\/AARNOLD87\/AngularLibrary<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo come possiamo riutilizzare i nostri componenti in pi\u00f9 progetti con le librerie di Angular<\/p>\n","protected":false},"author":196716250,"featured_media":27728,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637387],"class_list":["post-27727","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-angular"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Creare librerie di componenti Angular - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creare librerie di componenti Angular - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo come possiamo riutilizzare i nostri componenti in pi\u00f9 progetti con le librerie di Angular\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-07T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Adolfo Arnold\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adolfo Arnold\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/\"},\"author\":{\"name\":\"Adolfo Arnold\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\"},\"headline\":\"Creare librerie di componenti Angular\",\"datePublished\":\"2020-01-07T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/\"},\"wordCount\":1755,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-15.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Angular\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/\",\"name\":\"Creare librerie di componenti Angular - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-15.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-01-07T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-15.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-15.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/creare-librerie-di-componenti-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Creare librerie di componenti Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/0de430b61c8a48b0e9d81308817c1517\",\"name\":\"Adolfo Arnold\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g\",\"caption\":\"Adolfo Arnold\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/adolfo-arnoldblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Creare librerie di componenti Angular - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/","og_locale":"it_IT","og_type":"article","og_title":"Creare librerie di componenti Angular - Blexin","og_description":"Vediamo come possiamo riutilizzare i nostri componenti in pi\u00f9 progetti con le librerie di Angular","og_url":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/","og_site_name":"Blexin","article_published_time":"2020-01-07T23:00:00+00:00","article_modified_time":"2021-01-13T08:40:17+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Adolfo Arnold","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Adolfo Arnold","Tempo di lettura stimato":"11 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/"},"author":{"name":"Adolfo Arnold","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"headline":"Creare librerie di componenti Angular","datePublished":"2020-01-07T23:00:00+00:00","dateModified":"2021-01-13T08:40:17+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/"},"wordCount":1755,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","keywords":["Angular"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/","url":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/","name":"Creare librerie di componenti Angular - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","datePublished":"2020-01-07T23:00:00+00:00","dateModified":"2021-01-13T08:40:17+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/creare-librerie-di-componenti-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Creare librerie di componenti Angular"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/0de430b61c8a48b0e9d81308817c1517","name":"Adolfo Arnold","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ff2a87b54d0f130d7452164533199af05ef16dbd08b9241729946cea0eec7cca?s=96&d=identicon&r=g","caption":"Adolfo Arnold"},"url":"https:\/\/blexin.com\/it\/author\/adolfo-arnoldblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-15.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-7dd","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716250"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=27727"}],"version-history":[{"count":9,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27727\/revisions"}],"predecessor-version":[{"id":27749,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27727\/revisions\/27749"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/27728"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=27727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=27727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=27727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}