From cc7917b6c0a7303f668196ed54b8787249d1cf7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dydo?= Date: Mon, 25 Apr 2022 15:11:56 +0200 Subject: [PATCH 1/6] Best practices first version --- .DS_Store | Bin 0 -> 8196 bytes _data/navigation.yml | 11 ++ _pages/dev/best-practises/best-practises.md | 13 +++ .../extending-best-practices.md | 94 +++++++++++++++ .../i18n-best-practises.md | 35 ++++++ .../layout-best-practices.md | 94 +++++++++++++++ .../structure-best-practices.md | 108 ++++++++++++++++++ .../styles-best-practices.md | 5 + assets/.DS_Store | Bin 0 -> 6148 bytes assets/images/.DS_Store | Bin 0 -> 10244 bytes assets/images/structure-best-practises-1.png | Bin 0 -> 45856 bytes 11 files changed, 360 insertions(+) create mode 100644 .DS_Store create mode 100644 _pages/dev/best-practises/best-practises.md create mode 100644 _pages/dev/best-practises/extending-best-practices/extending-best-practices.md create mode 100644 _pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md create mode 100644 _pages/dev/best-practises/layout-best-practices/layout-best-practices.md create mode 100644 _pages/dev/best-practises/structure-best-practices/structure-best-practices.md create mode 100644 _pages/dev/best-practises/styles-best-practices/styles-best-practices.md create mode 100644 assets/.DS_Store create mode 100644 assets/images/.DS_Store create mode 100644 assets/images/structure-best-practises-1.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5541ef67775381203fcb57efdc3560eac0a17405 GIT binary patch literal 8196 zcmeHM%Wl&^6upzAi9>i~QKW)|WQlDRlD53WCZw%UB_2{;U;!w^Nl2r*b`(3LRaGf_ z;1~D>_WTF@3oAHx#;rVds_qbv8ENL)Gv~~V&z%|PIz%K|lU{>piHIy@w$%!XIf>gj zXHqV%xdto1r=aV4fs4Cp25Tye0!9I&fKk9GU=;W>6u>*1lXb>>U$vUjC}0%$FBRbP z!A54=jO|QWd32zVApmRv)iU8){`iNrxdOHs+nKVcK@y4ztEeIlF+?0Y2t`MGGse%9 zRdf<^Wb_k{EaC`7#G!|EntUDQtz>)TMxYdPhSVfO80zr?ccdlCxa^t4AG* zsFOnST+Tqc({L1j!T9QqykQvC>)%B#Usx!Xtddo+-Z;C#)QLLLBy4rYulQ~!2t4=X zy5qhW_NVRY;(FjmouS_!OTw_%2jun3q2CLptzhE!LdkVhgH^W5?dtWTqm|XWE6aA{ zcH?;2K5EqOtu5PkR_`Alm#wQeZ#~#-3DC(hhCY7PaU(uC{RhXx2wwqGCBwqO%%Sy4F6do&I z!x!Ybk7zfAgH9T*3@>fsxi;vDoJ-~mWDjYK5_U*edS{ef|E#QrhFeTB3Y@DzULlq^ z{@*-storefront` in `src/app/-storefront` folder. +2. Extend our own `StorefrontComponent` with Spartacus `StorefrontComponent`. +3. Copy Spartacus Storefron Component template and paste it in our own Storefront template with our own customization. We can here: + - modify elements order + - add custom elements +4. Import in our Storefront Module all required modules +5. Import our Storefront module in `AppModule` + +Example custom storefront template: + +``` + + + + +
+ + +
+ + +
+ +
+ +
+ + +
+ +
+
+ + +
+ +``` diff --git a/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md new file mode 100644 index 000000000..e490f721e --- /dev/null +++ b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md @@ -0,0 +1,108 @@ +--- +title: Structure Best Practices +--- + +Spartacus schematics installation gives us the basic structure of folder structure. It is adding `spartacus` folder with required modules and `feature` folder with feature libs and their modules. We are recommending to not modify `spartacus` folder with any own folder/files because of schematics installation and possible conflicts in the future. The only once modification we can recommend is about `configuration` folder describe in `layout-best-practices.md` and `i18n-best-practices.md`. + +## Our structure recommandations: + +### Shared folder + +Under `app`, create `shared` folder. This folder will contain all elements used globally in the project like cms-components, components, adapters, connectors, guards, configs, directives, pipes, etc. + +We will suggest creating a separate folder for each of the above examples. We will recommend also dividing the folder for components into: `components` and `cms-components`, the first one is to keep shared components, but the second one is to keep all shared components with cms mapping. + +### Features folder + +Next folder we will recommand to create is `features` folder next to the `shared`. This folder will containt all page main features/modules. For each page funcionality/module we should create seperate folder, including following folders: +- components +- services +- adapters +- configs +- assets +- ... + +Below there is an example of the structure: + +Shopping Cart + +### Features module + +For each feature module, we are recommending to provide all configs in main feature module: + +``` +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { CartTotalModule } from './components/cart-total/cart-total.module'; +import { + cartCmsConfig, + cartOccConfig, + cartRoutingConfig, + cartTranslationsConfig, +} from './configs/cart.config'; +import { provideConfig } from '@spartacus/core'; + +@NgModule({ + imports: [CommonModule, CartTotalModule], + providers: [ + provideConfig(cartCmsConfig), + provideConfig(cartOccConfig), + provideConfig(cartRoutingConfig), + provideConfig(cartTranslationsConfig), + ], +}) +export class CustomCartModule {} +``` + +with config file `cart.config.ts` in `src/app/features/cart/configs/cart.config.ts`: + +``` +import { + CmsConfig, + I18nConfig, + OccConfig, + RoutingConfig, +} from '@spartacus/core'; + +export const cartRoutingConfig: RoutingConfig = { + routing: { + routes: { + customRoute: { + paths: ['cart/custom'], + }, + }, + }, +}; + +export const cartOccConfig: OccConfig = { + backend: { + occ: { + endpoints: { + cart: 'users/${userId}/carts/${cartId}?fields=Full', + }, + }, + }, +}; + +export const cartCmsConfig: CmsConfig = { + cmsComponents: { + CartTotalsComponent: { + component: CustomCartTotalsComponent, + }, + }, +}; + +const cartTranslationsOverwrites = { + en: { + cart: { + custom: 'Custom', + }, + }, +}; + +export const cartTranslationsConfig: I18nConfig = { + i18n: { + resources: cartTranslationsOverwrites, + }, +}; +``` diff --git a/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md b/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md new file mode 100644 index 000000000..1ecb7c424 --- /dev/null +++ b/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md @@ -0,0 +1,5 @@ +--- +title: Styles Best Practices +--- + +TODO diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c0a47494b07e2444d5e2597c869a39419f508b3b GIT binary patch literal 6148 zcmeHKPfrs;6o0Q2x&@I1S_Ps>V=pEUrGWop45eU{7z0v*C4hC?4rO7x)9h|RASAu3 z2S0!xz>{~qc=Y1coAD#))sw!Nod!zPqY$$%nfbkW^WK}j-*$F(001+!QVKu^0F9c! za3^)Y5iu`Xi-eRVLWm* zNu;i&4n`9DsnMGgBZ=$dw+;@XT0D96_CkKks@VL6tPzmjV^X>mHsB>GO$?aDZB-S1 zYE<=A*Bf<3JG;(wpY73m`}%uhz47?D^8@k0p`in`(hNA%^q-s2V> zZdvo(H9eEt%d0N2J?pW`ti8@@#cg7Gt}3S7CFZzTtP)X`+Z7EKiwFzoZsRh~bg4iIWAj+e38LF~i&7P81+t4&OZ#@5~En$<^G2 zH0UofkxcgF5asbg>r{~#NDL$f5(9~W#K2i#0DCsm%Bq#AObjFj5(7UOV0@?{Q#PEO zS*f7|g}uxyv9ohg?1a! zaq1YGb2xO&wV}-vH4*-oJ{OQHvJbAC`SI0CA3ZCr0sR;w9RRnE_L+`Bo7K_32g`Mf za}e6b$5=OmL!-$-pa zRt+Z+4BF1exPqCCU>EvOUHKmag>|R+PM>Ijsh~b;Umt4?Yh}*v02uVFeaNYLR2YMn z^f4~W8?^6XK1b;7>$Vxzf>t&cJS)c$9!3ygin`U?Qb{LPI;p4>_kE}6W=U+WPh$BSSm|EROSi_tU@$u;? z7j@ko1}=seZ-79w%%c0&bp!#Tsz@(PkJBiKsbBZVKd9*$2gPhQd za-(qNPSDy$FMIOgS&ZIkquB@}F|sj+vNjqoE4Q$te(`uYr<(N9J1h7yyfCLlRTu&3 zgWP`^E9l48BaiS4W1~G0FrJ5JhL}{qe22Cztlpt|i$&%LwCr=_*Z7??V>Az9(jRk} zm|#kYfy6*!;IA2|ScKXtnThRY zR%#a%`Z^v`U&rGMU&r4;X50IeOn7cMIkOTqNdNrLfQ7f3>HhD|xas~c|Hu9R2VqRN AD*ylh literal 0 HcmV?d00001 diff --git a/assets/images/structure-best-practises-1.png b/assets/images/structure-best-practises-1.png new file mode 100644 index 0000000000000000000000000000000000000000..07afa8bae7185567753d72afc96d4b8a39bfee7e GIT binary patch literal 45856 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 literal 0 HcmV?d00001 From 12b01978e181c2dc9cc99f53cdc396ebe442da4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Wed, 27 Apr 2022 15:04:30 +0200 Subject: [PATCH 2/6] Update _pages/dev/best-practises/best-practises.md Co-authored-by: Michal Szczepaniak <97286147+szczepaniak-michal@users.noreply.github.com> --- _pages/dev/best-practises/best-practises.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_pages/dev/best-practises/best-practises.md b/_pages/dev/best-practises/best-practises.md index 997c99d61..8ed31474d 100644 --- a/_pages/dev/best-practises/best-practises.md +++ b/_pages/dev/best-practises/best-practises.md @@ -2,7 +2,7 @@ title: Best practises --- -This is a landing page for developers best practises topics. This includes the following: +This is a landing page for developers best practises topics. It includes the following: - [{% assign linkedpage = site.pages | where: "name", "layout-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/layout-best-practices.md %}) - [{% assign linkedpage = site.pages | where: "name", "i18n-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/i18n-best-practices.md %}) From 7b1004b219eeb5eac17d3a5096605b529b9cac3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Wed, 27 Apr 2022 15:04:58 +0200 Subject: [PATCH 3/6] Update _pages/dev/best-practises/extending-best-practices/extending-best-practices.md Co-authored-by: Michal Szczepaniak <97286147+szczepaniak-michal@users.noreply.github.com> --- .../extending-best-practices/extending-best-practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md b/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md index f778fa209..f2412869f 100644 --- a/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md +++ b/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md @@ -6,7 +6,7 @@ The Spartacus library gives us great opportunities. Many Spartacus elements can Extending the elements should be the basic action we will perform in Spartacus implementation projects. -Each time you will have to implement a new feature or just a single functionality, find it or something similar in the Spartacus Code and analyze how much you can reuse it. +Each time you have to implement a new feature or a single functionality, find it or something similar in the Spartacus Code and analyse how much you can reuse. ### Extending components From d37ab12694beeb5611f251d8fc1af6c5cf12926d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20D?= Date: Wed, 27 Apr 2022 15:05:07 +0200 Subject: [PATCH 4/6] Update _pages/dev/best-practises/best-practises.md Co-authored-by: Michal Szczepaniak <97286147+szczepaniak-michal@users.noreply.github.com> --- _pages/dev/best-practises/best-practises.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_pages/dev/best-practises/best-practises.md b/_pages/dev/best-practises/best-practises.md index 8ed31474d..4276a6550 100644 --- a/_pages/dev/best-practises/best-practises.md +++ b/_pages/dev/best-practises/best-practises.md @@ -10,4 +10,4 @@ This is a landing page for developers best practises topics. It includes the fol - [{% assign linkedpage = site.pages | where: "name", "extending-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/extending-best-practices.md %}) - [{% assign linkedpage = site.pages | where: "name", "styles-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/styles-best-practices.md %}) -All of the above instructions are only suggestions for the best approach to use Spartacus from the core team members. +All of the above instructions are only suggestions on how to use Spartacus from the core team members. From f7d64037e910c35eab7ad3a6958e28e4d408d045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dydo?= Date: Fri, 29 Apr 2022 11:08:04 +0200 Subject: [PATCH 5/6] Refactor --- _pages/dev/best-practises/best-practises.md | 1 + .../extending-best-practices.md | 9 +++++++-- .../i18n-best-practises/i18n-best-practises.md | 4 ++-- .../layout-best-practices.md | 16 ++++++---------- .../naming-best-practices.md | 8 ++++++++ .../structure-best-practices.md | 8 ++++---- .../styles-best-practices.md | 2 +- 7 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 _pages/dev/best-practises/naming-best-practices/naming-best-practices.md diff --git a/_pages/dev/best-practises/best-practises.md b/_pages/dev/best-practises/best-practises.md index 997c99d61..ae1068b9e 100644 --- a/_pages/dev/best-practises/best-practises.md +++ b/_pages/dev/best-practises/best-practises.md @@ -5,6 +5,7 @@ title: Best practises This is a landing page for developers best practises topics. This includes the following: - [{% assign linkedpage = site.pages | where: "name", "layout-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/layout-best-practices.md %}) +- [{% assign linkedpage = site.pages | where: "name", "naming-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/naming-best-practices.md %}) - [{% assign linkedpage = site.pages | where: "name", "i18n-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/i18n-best-practices.md %}) - [{% assign linkedpage = site.pages | where: "name", "structure-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/structure-best-practices.md %}) - [{% assign linkedpage = site.pages | where: "name", "extending-best-practices.md" %}{{ linkedpage[0].title }}]({{ site.baseurl }}{% link _pages/dev/best-practises/extending-best-practices.md %}) diff --git a/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md b/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md index f778fa209..94ccf708b 100644 --- a/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md +++ b/_pages/dev/best-practises/extending-best-practices/extending-best-practices.md @@ -34,6 +34,11 @@ export class CustomCartTotalsComponent extends CartTotalsComponent implements On customMethod(): void { // custom method } + + customMethodWithActiveCartService(): Observable { + // Custom method + // return this.activeCartService.getActive(); + } } ``` @@ -65,7 +70,7 @@ If we need to extend any adapter/service/serializer/guard we should do it in a s }, ] }) -export class CartTotalModule { } +export class CustomCartTotalModule { } ``` ### Extending pageMetaResolvers and normalizers @@ -90,5 +95,5 @@ Extending Page Meta Resolvers or Normalizer looks the same as with adapters, the }, ] }) -export class CartTotalModule { } +export class CustomCartTotalModule { } ``` \ No newline at end of file diff --git a/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md b/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md index 3b621a616..560bb9014 100644 --- a/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md +++ b/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md @@ -11,7 +11,7 @@ For global translations use create `i18n-assets` inside `assets` and than create `i18n.ts` example: ``` -export const customi18nConfig: I18nConfig = { +export const customI18nConfig: I18nConfig = { i18n: { backend: { loadPath: 'assets/i18n-assets/{{lng}}/{{ns}}.json', @@ -31,5 +31,5 @@ Once we will create the file and provide our own customization we have to provid @NgModule({ ... providers: [ - provideConfig(customi18nConfig), + provideConfig(customI18nConfig), ... diff --git a/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md b/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md index 3b1130ad5..b8cd1b2a3 100644 --- a/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md +++ b/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md @@ -15,21 +15,17 @@ Another very common case is adding additional layouts to the configuration and a ```export const customLayoutConfig: LayoutConfig = { layoutSlots: { prologue: { - xl: { - slots: [ + slots: [ 'PreHeader', 'SearchBox', 'SiteLogo', ], - }, - lg: { - slots: ['PreHeader'', 'SearchBox'], - }, - slots: ['PreHeader', 'SiteLogo'], }, } }; +There is a possibility to add breakpoints in the layout config, but it affects performance and causes flickering in SSR. If it is possible, responsiveness should be achieved via CSS whenever it is possible. + Once we will create the file and provide our own customization we have to provide it in `src/app/spartacus/spartacus-configuration.module.ts`: ``` @@ -45,14 +41,14 @@ Once we will create the file and provide our own customization we have to provid In many projects the cx-storefront directive usage will be sufficient, but it is highly probable that to facilitate the work on spartacus it will be easier for us to slightly modify the default storefront layout. -In this case we will recommend to: +In this case we recommend to: 1. Create module with component `-storefront` in `src/app/-storefront` folder. 2. Extend our own `StorefrontComponent` with Spartacus `StorefrontComponent`. 3. Copy Spartacus Storefron Component template and paste it in our own Storefront template with our own customization. We can here: - modify elements order - add custom elements -4. Import in our Storefront Module all required modules -5. Import our Storefront module in `AppModule` +4. Import in your Storefront Module all required modules +5. Import your Storefront module in `AppModule` Example custom storefront template: diff --git a/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md b/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md new file mode 100644 index 000000000..01379c6be --- /dev/null +++ b/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md @@ -0,0 +1,8 @@ +--- +title: Naming Best Practices +--- + +We highly recommend naming all custom elements with a project prefix. This will avoid problems with importing elements. It is easy to mistake a custom module with a Spartacus module, for example: + +Instead of own module `CartTotalModule` use `CartTotalModule` where `your_prefix` is globally used prefix in the project. + diff --git a/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md index e490f721e..691231a1f 100644 --- a/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md +++ b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md @@ -10,11 +10,11 @@ Spartacus schematics installation gives us the basic structure of folder structu Under `app`, create `shared` folder. This folder will contain all elements used globally in the project like cms-components, components, adapters, connectors, guards, configs, directives, pipes, etc. -We will suggest creating a separate folder for each of the above examples. We will recommend also dividing the folder for components into: `components` and `cms-components`, the first one is to keep shared components, but the second one is to keep all shared components with cms mapping. +We suggest creating a separate folder for each of the above examples. We recommend also dividing the folder for components into: `components` and `cms-components`, the first one is to keep shared components, but the second one is to keep all shared components with cms mapping. ### Features folder -Next folder we will recommand to create is `features` folder next to the `shared`. This folder will containt all page main features/modules. For each page funcionality/module we should create seperate folder, including following folders: +Next folder we recommand to create is `features` folder next to the `shared`. This folder will containt all page main features/modules. For each page funcionality/module we should create seperate folder, including following folders: - components - services - adapters @@ -33,7 +33,7 @@ For each feature module, we are recommending to provide all configs in main feat ``` import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { CartTotalModule } from './components/cart-total/cart-total.module'; +import { CustomCartTotalModule } from './components/cart-total/cart-total.module'; import { cartCmsConfig, cartOccConfig, @@ -43,7 +43,7 @@ import { import { provideConfig } from '@spartacus/core'; @NgModule({ - imports: [CommonModule, CartTotalModule], + imports: [CommonModule, CustomCartTotalModule], providers: [ provideConfig(cartCmsConfig), provideConfig(cartOccConfig), diff --git a/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md b/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md index 1ecb7c424..faa7753a4 100644 --- a/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md +++ b/_pages/dev/best-practises/styles-best-practices/styles-best-practices.md @@ -2,4 +2,4 @@ title: Styles Best Practices --- -TODO +Spartacus styles are optional and if the project has a very custom design and has time to do everything from scratch, it's best to turn them off immediately. Avoid using global styles to overwrite Spartacus styles. From 1a18ce10acdae2a301ad125965cc0799ae8d3669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dydo?= Date: Fri, 29 Apr 2022 11:12:22 +0200 Subject: [PATCH 6/6] Refactor v2 --- .../i18n-best-practises/i18n-best-practises.md | 2 +- .../layout-best-practices/layout-best-practices.md | 2 +- .../naming-best-practices/naming-best-practices.md | 2 +- .../structure-best-practices/structure-best-practices.md | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md b/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md index 560bb9014..9d9b99413 100644 --- a/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md +++ b/_pages/dev/best-practises/i18n-best-practises/i18n-best-practises.md @@ -4,7 +4,7 @@ title: I18n Best Practices Spartacus project has default translations. It is obvious that in each project we will need to add our own translations. -The best place to do it is to create file `i18n.ts` in `src/app/spartacus/configurations` folder and export it as `I18nConfig`. We sincerely recommend tp add only global translations here and to add all the rest related to individual modules translations in those modules (describe in modules-best-practices). +The best place to do it is to create file `i18n.ts` in `src/app/spartacus/configurations` folder and export it as `I18nConfig`. We sincerely suggest to add only global translations here and to add all the rest related to individual modules translations in those modules (describe in modules-best-practices). For global translations use create `i18n-assets` inside `assets` and than create seperate folder for each language, example: `en`, `de`, etc. diff --git a/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md b/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md index b8cd1b2a3..4421ae75b 100644 --- a/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md +++ b/_pages/dev/best-practises/layout-best-practices/layout-best-practices.md @@ -41,7 +41,7 @@ Once we will create the file and provide our own customization we have to provid In many projects the cx-storefront directive usage will be sufficient, but it is highly probable that to facilitate the work on spartacus it will be easier for us to slightly modify the default storefront layout. -In this case we recommend to: +In this case we suggest to: 1. Create module with component `-storefront` in `src/app/-storefront` folder. 2. Extend our own `StorefrontComponent` with Spartacus `StorefrontComponent`. 3. Copy Spartacus Storefron Component template and paste it in our own Storefront template with our own customization. We can here: diff --git a/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md b/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md index 01379c6be..bc102af64 100644 --- a/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md +++ b/_pages/dev/best-practises/naming-best-practices/naming-best-practices.md @@ -2,7 +2,7 @@ title: Naming Best Practices --- -We highly recommend naming all custom elements with a project prefix. This will avoid problems with importing elements. It is easy to mistake a custom module with a Spartacus module, for example: +We highly suggest naming all custom elements with a project prefix. This will avoid problems with importing elements. It is easy to mistake a custom module with a Spartacus module, for example: Instead of own module `CartTotalModule` use `CartTotalModule` where `your_prefix` is globally used prefix in the project. diff --git a/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md index 691231a1f..40ffa0d24 100644 --- a/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md +++ b/_pages/dev/best-practises/structure-best-practices/structure-best-practices.md @@ -2,7 +2,7 @@ title: Structure Best Practices --- -Spartacus schematics installation gives us the basic structure of folder structure. It is adding `spartacus` folder with required modules and `feature` folder with feature libs and their modules. We are recommending to not modify `spartacus` folder with any own folder/files because of schematics installation and possible conflicts in the future. The only once modification we can recommend is about `configuration` folder describe in `layout-best-practices.md` and `i18n-best-practices.md`. +Spartacus schematics installation gives us the basic structure of folder structure. It is adding `spartacus` folder with required modules and `feature` folder with feature libs and their modules. We are suggesting to not modify `spartacus` folder with any own folder/files because of schematics installation and possible conflicts in the future. The only once modification we can suggest is about `configuration` folder describe in `layout-best-practices.md` and `i18n-best-practices.md`. ## Our structure recommandations: @@ -10,7 +10,7 @@ Spartacus schematics installation gives us the basic structure of folder structu Under `app`, create `shared` folder. This folder will contain all elements used globally in the project like cms-components, components, adapters, connectors, guards, configs, directives, pipes, etc. -We suggest creating a separate folder for each of the above examples. We recommend also dividing the folder for components into: `components` and `cms-components`, the first one is to keep shared components, but the second one is to keep all shared components with cms mapping. +We suggest creating a separate folder for each of the above examples. Then divide the folder for components into: `components` and `cms-components`, the first one is to keep shared components, but the second one is to keep all shared components with cms mapping. ### Features folder @@ -28,7 +28,7 @@ Below there is an example of the structure: ### Features module -For each feature module, we are recommending to provide all configs in main feature module: +For each feature module, we are suggesting to provide all configs in main feature module: ``` import { NgModule } from '@angular/core';