@dflat-core/web

中文文档
1.7.2095发布于 2026/11/10MITTypeScriptES Module近 30 天下载 5021

Librairies Angular Dflat (core, core-, system-) et assets partagés, empaquetées en un module npm unique.

原始使用文档
文档目录7 节
  1. Points d'entrée
  2. Coquille applicative
  3. Tester
  4. Construire
  5. Utiliser dans un espace de travail Angular / Nx
  6. Règles propres à une librairie
  7. Code généré

@dflat-core/web

Librairies Angular de Dflat, empaquetées en un module npm unique (Angular Package Format, construit avec ng-packagr).

Points d'entrée

ImportContenu
@dflat-core/web/coreUtilitaires, EnvironmentBase
@dflat-core/web/core-modelModèle de base (interfaces générées depuis Dflat.Kernel.Model)
@dflat-core/web/core-servicesAuthentification, messages, menus, hub SignalR...
@dflat-core/web/core-dataDataService, EntityDataService
@dflat-core/web/core-uxComposants, directives et services d'interface
@dflat-core/web/core-ux/testingSuites de test standard (describeBaseComponent, describeGeneratedModule) et doublures, pour les fichiers .spec.ts
@dflat-core/web/system-modelModèle du module System (généré)
@dflat-core/web/system-dataServices de données du module System (générés)
@dflat-core/web/system-rootPermissions, clés d'entités et menus du module System
@dflat-core/web/system-uxÉcrans du module System, et la coquille applicative

Ressources non TypeScript livrées dans le package :

  • assets/ : styles partagés (site.scss, variables.scss, text.scss...), images et polices ;
  • scss/ : styles globaux (dflat-app.scss, core-ux.scss, layout/default/default-layout.scss...).

Coquille applicative

system-ux fournit, en plus des écrans du module System, tout ce qui faisait auparavant l'ossature de l'application hôte (system-ux/src/lib/app) :

SymboleRôle
DflatAppModuleSocle du module racine : modules Angular et tiers, intercepteur HTTP, permissions, menus, langue
DFlatLayoutComponentMise en page : barre supérieure, menu latéral, contenu
HomepageComponent, SearchComponent, SearchResultComponentAccueil et recherche globale
UserMenuComponent, UserProfileComponentMenu et profil de l'utilisateur
AccessDeniedComponent, HistoryComponent, DFlatSpinnerComponentÉcrans et composants utilitaires
DflatAppServiceNom, logo et version de l'application (EnvironmentBase)
DFlatAuthInterceptor, DFlatPermissionServiceImplémentations par défaut, dérivables

Le module racine d'une application se réduit alors à :

@NgModule({
    declarations: [AppComponent],
    imports: [DflatAppModule.forRoot(environment), routing],
    bootstrap: [AppComponent]
})
export class AppModule {}

environment implémente EnvironmentBase : URL de l'API, du hub et des fichiers, et, en option, appName, appLogoUrl et appVersion, affichés par la mise en page et la page d'accueil. Pour remplacer un service du socle (menus, permissions, intercepteur), il suffit de le fournir après DflatAppModule dans les providers du module racine.

La recherche globale n'interroge que les sources déclarées par l'application : une classe dérivée de DflatSearchProvider par famille d'objets, fournie en multi sous le jeton DFLAT_SEARCH_PROVIDERS.

Tester

yarn test                              # tous les *.spec.ts du package (Vitest, jsdom)
yarn vitest run core-ux                # un dossier ou un fichier
yarn tsc -p tsconfig.spec.json         # contrôle des types des tests

@dflat-core/web/core-ux/testing fournit la suite de test standard de BaseComponent :

describeBaseComponent('BaseCountryComponent', (app, route) => new TestCountryComponent(app, route), {
    entityKey: 'country', path: '/sys/country', title: 'Pays', permissionKey: 'system.country', requestsSections: true
});

Elle vérifie le contrat de BaseComponent sans rendre de gabarit : création dans un contexte d'injection, clé d'entité, lien, titre et permission, façade demandée au registre avec la clé de l'entité, ngOnInit (fil d'Ariane, chargement branché sur dataService.search, abonnement aux notifications, demande des onglets au registre EntitySections), Search / refresh, mise à jour sur notification, ngOnDestroy. Elle n'utilise que les fonctions globales de l'outil de test (describe, it, beforeEach, expect) et TestBed : elle ne dépend pas de l'outil. BaseComponentTestContext fournit les services du composant (vraies classes du socle, doublures pour DataService et Router).

  • core-ux/src/lib/v2/components/base-component/base-component.spec.ts applique la suite à un composant minimal et teste les cas propres à la classe ;
  • dflat -g ts génère, pour chaque composant Base<X>Component d'un module, <x>.component.generated.spec.ts (la même suite, avec les valeurs attendues du générateur) et, par module, <module>-components.generated.spec.ts (describeGeneratedModule : chaque composant a sa route, clés d'entité uniques, onglets des entités liées attendus par entité et pointant vers des entités et composants du module, éléments de menu vers une route existante et porteurs d'une permission du module).

Les onglets des entités liées (sections @relations des formulaires) sont déclarés pour tout le module par le service généré <Module>GeneratedSectionService (<module>-sections.generated.ts), seul fichier généré qui importe les composants des onglets. Le module Angular <module>-ux l'enregistre dans son constructeur, EntitySections.register(injector.get(<Module>GeneratedSectionService)), et Base<X>Component demande ses onglets par la clé de son entité (EntitySections.registerSections(this.getEntityKey(), this.facade)), sans importer d'autre composant : pas de dépendance circulaire entre composants. Le service n'est interrogé qu'une fois par entité : la définition des onglets est gardée dans le cache d'initialisation des écrans (InitCacheService, DataService.getCachedValue), comme les descripteurs de filtre et le filtre vide, et vidée avec eux ; l'enregistrement sur la façade est fait à chaque initialisation.

Dans le package, Vitest est lancé directement (vitest.config.mts, tools/vitest.setup.ts), sans angular.json : les décorateurs sont compilés en mode JIT et les gabarits remplacés par un gabarit vide. Une application lance les mêmes tests par sa cible test (@angular/build:unit-test, Vitest et jsdom), que le modèle dflat-webhost déclare (yarn test dans webapps). Les .spec.ts ne sont pas publiés ; seul le point d'entrée testing l'est.

Construire

yarn install
yarn build           # <dépôt>/artifacts/nodejs/dflat-web (compilation partielle, publiable)
yarn watch           # reconstruction continue pendant le développement
yarn run pack        # <dépôt>/artifacts/nodejs/dflat-web-<version>.tgz

Depuis la racine du dépôt, scripts/publish-dflat.ps1 enchaîne ces étapes :

.\scripts\publish-dflat.ps1 -bw                  # yarn install si besoin, build, vidage du cache Angular de webapps
.\scripts\publish-dflat.ps1 -pn                  # package versionné + archive .tgz (version calculée depuis npmjs.com)
.\scripts\publish-dflat.ps1 -pn -Push            # ... puis publication sur npmjs.com, après confirmation

yarn install applique tools/patch-ng-packagr.js : correctif d'un bug de ng-packagr 19.2 sur la réécriture des url() des partials Sass (voir le commentaire du script).

Utiliser dans un espace de travail Angular / Nx

  1. Dépendance, dans package.json : la version publiée sur npmjs.com ("@dflat-core/web": "1.0.2"), cas de toute application, dont celles créées par dflat -newhost.

    webapps, dans le dépôt, n'en dépend pas : il compile les librairies depuis leurs sources, pour développer le package et l'application en même temps. Les chemins de webapps/tsconfig.json mènent à webapps/libs/dflat-web, une jonction par point d'entrée vers web/dflat-web :

    "@dflat-core/web": ["libs/dflat-web/src/index.ts"],
    "@dflat-core/web/*": ["libs/dflat-web/*/src/index.ts"]
    

    Les jonctions (non versionnées) sont créées par webapps/tools/check-dflat-web.js, lancé par yarn start et par dflat -r / dflat -rc. Elles sont individuelles : une seule jonction vers web/dflat-web ferait résoudre Angular dans web/dflat-web/node_modules (double instance). Toute modification d'un fichier du package (TypeScript, template, style) est recompilée par nx serve dans la foulée (quelques secondes), sans compiler dist ni vider le cache. L'application doit aussi installer les peerDependencies du package : les librairies Angular tierces qu'il utilise (ngx-toastr, ng-http-loader...). Le package ne dépend plus de Bootstrap : les styles de base et des classes de Bootstrap qu'il utilise sont dans ses assets (assets/components/bootstrap-lite.scss). Les icônes « fa fa- » n'utilisent plus font-awesome : ce sont des SVG des assets (assets/images/icons/fa, feuille assets/components/icons.scss). Le modèle dflat-webhost les liste déjà dans le package.json du front qu'il génère.

  2. Dans les options de build de l'application (project.json) :

    "preserveSymlinks": true,
    "stylePreprocessorOptions": { "includePaths": ["node_modules", "node_modules/@dflat-core/web/assets"] },
    "assets": [{ "input": "node_modules/@dflat-core/web/assets", "glob": "*/**", "output": "assets" }]
    

    preserveSymlinks évite de résoudre Angular depuis web/dflat-web/node_modules (double instance). Les includePaths permettent à dflat-app.scss de résoudre les feuilles des assets du package.

  3. Styles globaux (styles.scss) :

    @import "../../../node_modules/@dflat-core/web/scss/dflat-app.scss";
    

    dflat-app.scss enchaîne les variables, les styles de base et des classes de Bootstrap utilisées, avec le thème Pulse du package (assets/components/bootstrap-lite.scss, générée par tools/generate-bootstrap-lite.js à partir de Bootstrap 4, de assets/theme-variables.scss et de assets/theme.scss), core-ux.scss, site.scss et les règles de mise en page plein écran de la coquille. Une application qui utilise d'autres classes de Bootstrap installe bootstrap et importe ses parties après dflat-app.scss.

    Les feuilles de style tierces qui ne passent pas par Sass (toastr) restent dans le tableau styles des options de build.

Règles propres à une librairie

La compilation partielle d'Angular est plus stricte que celle d'une application :

  • pas d'import par le barrel de sa propre librairie (@dflat-core/web/core-ux depuis core-ux) : utiliser un chemin relatif. Entre librairies, toujours passer par @dflat-core/web/<librairie> ;
  • toute classe déclarée par un NgModule doit être exportée par le src/index.ts de sa librairie (NG3001) ;
  • pas de cycle d'imports entre un composant et ce qu'utilise son template (NG3003). Pour casser un cycle : import type lorsque le symbole ne sert qu'au typage, ou un InjectionToken lorsqu'un type de composant est nécessaire à l'exécution (voir core-ux/src/lib/modals/dialog-component.tokens.ts, RowRefHost dans row-ref.directive.ts) ;
  • pas de cycle d'imports entre une classe et sa classe parente, même indirect : chaque point d'entrée est aplati en un seul fichier et la classe fille pourrait y être émise avant la parente (Cannot access 'X' before initialization au démarrage de l'application). tools/check-bundles.js, lancé par npm run build, le détecte.

Code généré

codegenerator -ts -webpkg <dépôt>\web\dflat-web écrit les librairies Dflat (core-model, system-model, system-data) dans ce dossier et génère les imports en @dflat-core/web/<librairie>. Sans -webpkg (application hôte hors dépôt), ces librairies ne sont pas générées : elles sont fournies par le package. dbmanager écrit les permissions TypeScript du module System dans system-root/src/lib.

版本与发布记录

@dflat-core/web 共发布 87 个版本,首次发布于 2026/09/15;过去 12 个月发布了 87 个版本。

版本发布日期距今
1.7.2095latest2026/11/101 天前
1.7.20942026/11/102 天前
1.7.20932026/11/083 天前
1.7.20922026/11/075 天前
1.7.20912026/11/075 天前
1.7.20902026/11/065 天前

其他发布通道:next → 1.0.0-beta。

关于 @dflat-core/web 的常见问题

@dflat-core/web 是什么?

Librairies Angular Dflat (core, core-, system-) et assets partagés, empaquetées en un module npm unique.

如何安装 @dflat-core/web?

在项目目录运行 npm install @dflat-core/web,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:rxjs(^7.4.0)、echarts(^6.0.0)、lodash-es(^4.17.21)、jwt-decode(^2.2.0)、ngx-toastr(^20.0.5)、@angular/cdk(^22.2.0)、ngx-dropzone(^3.1.0)、@angular/core(^22.2.0)、@angular/forms(^22.2.0)、ng-http-loader(^20.0.0)、ng-recaptcha-2(^22.0.1)、@angular/common(^22.2.0)、@angular/router(^22.2.0)、guid-typescript(^1.0.9)、@microsoft/signalr(^7.0.12)、ngx-image-compress(^13.1.13)、@angular/animations(^22.2.0)、@ng-select/ng-select(^24.2.0)、@kolkov/angular-editor(^2.1.0)、@samotics/ngx-treeview(^20.1.2)、@angular/platform-browser(^22.2.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@dflat-core/web 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dflat-core/web 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@dflat-core/web 可以商用吗?

@dflat-core/web 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dflat-core/web 的下载量有多少?

根据 npm 官方下载统计,@dflat-core/web 在 2026/10/12 – 2026/11/10 这 30 天内被下载 5,021 次,日均约 167 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dflat-core/web 还在维护吗?

最新版本 1.7.2095 发布于 2026/11/10(1 天前);至今共发布 87 个版本,其中过去 12 个月发布了 87 个;首次发布于 2026/09/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。