Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: withDevTools disabled in prod - tree-shaking docs #94

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -76,6 +76,52 @@ patchState(this.store, {loading: false});
updateState(this.store 'update loading', {loading: false});
```

`withDevtools()` is by default enabled in production mode, if you want to tree-shake it from the application bundle you need to abstract it in your environment file.

<details>

<summary>Devtools tree-shaking details</summary>

environment.ts:
```typescript
import { withDevtools } from '@angular-architects/ngrx-toolkit';

export const environment = {
storeWithDevTools: withDevtools
}
```

environment.prod.ts
```typescript
import { withDevtoolsStub } from '@angular-architects/ngrx-toolkit';

export const environment = {
storeWithDevTools: withDevToolsStub
}
```

Then all you need to do is replace `withDevTools` everywhere in your app with `environment.storeWithDevTools`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think it is possible to update the example with a utility function which encapsulates the access to environment?

I don't think it is a good idea if we promote spreading access to the environment in the codebase.

So something like

function withTreeShakableDevTools(featureName: string) {
  return environment.storeWithDevTolls(featureName);
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added an exported const which lets us not to import environment file directly, and allows for keeping the function signature internal to the library (may be useful if there were changes)

e.g.:
```typescript
export const SomeStore = signalStore(
withState({strings: [] as string[] }),
environment.storeWithDevTools('featureName')
);
```

Also make sure you have defined file replacements in angular.json prod configuration:
```json
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
```

</details>


## Redux: `withRedux()`

`withRedux()` bring back the Redux pattern into the Signal Store.
1 change: 1 addition & 0 deletions libs/ngrx-toolkit/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export {
withDevToolsStub,
withDevtools,
patchState,
updateState,
5 changes: 5 additions & 0 deletions libs/ngrx-toolkit/src/lib/with-devtools.ts
Original file line number Diff line number Diff line change
@@ -79,6 +79,11 @@ export function reset() {
storeRegistry.set({});
}

/**
* Stub for DevTools integration. Can be used to disable DevTools in production.
*/
export const withDevToolsStub: typeof withDevtools = () => store => store;

/**
* @param name store's name as it should appear in the DevTools
*/