-
✅ Prettier (details)
-
✅ Git hooks fallback for prettier (details)
-
Accessibility requirements
-
Development/deployment process (details)
-
Testing details (details)
- As needed testing dictated by complexity & risk
- Consider broad remote integration testing using puppeteer and live / develop environments
- What is importance of preventing failures at all costs, vs fixing them quickly, post e-commerce?
-
Set up
typescript-eslintlinter- How much typing?
-
More fleshed out
styled-componentspatterns fitting project component library, like typography. How are variants defined, used, extended. -
Fleshed out apollo + next.js state management example with static + stale/revalidate, SSR (details)
-
Consider phase 2+ features: authenticated experience, e-commerce (details)
-
Hosting. Probably not using Vercel, so need plan for deployment, staging environments, builds for PRs, ideally github hooks / links in interface (details)
-
Analytics (details)
-
SEO (details)
-
Browser support (details)
-
Storybook stories need automatic controls
Prettier should be enabled directly in developers code editors.
To get the most out of Prettier, it’s recommended to run it from your editor. (Source)
Note: we considered adding prettier as a linter, but it isn't recommended today due to high editor support today.
- You end up with a lot of red squiggly lines in your editor, which gets annoying. Prettier is supposed to make you forget about formatting – and not be in your face about it!
- They are slower than running Prettier directly.
- They’re yet one layer of indirection where things may break. (Source)
Prettier is also run on the pre-commit git hook against staged files (via lint-staged) to ensure dev environments that aren't set up properly or edits via terminal are guaranteed to be formatted.
Git hooks are managed by the husky lib which provides a simple pattern & enables team sharing better than manually managing and distributing .git/hooks
Hooks are stored in .husky/ and committed to the repo.
The new hooks directory is enabled by using npm/yarn prepare post install scripts automatically.
Apollo is a GraphQL client, but much more, and as such, we will likely want to create a demo fully integrated with next.js and flesh out patterns.
Explore Apollo for..
- Local
GraphQLclient - State management library
- Especially local data statically generated + fetch/revalidate
- Mocking
- API explorer? https://studio.apollographql.com/sandbox/explorer/
The application is being validated against phase 1 requirements, but consider that phase 2+ involves a lot of likely complexities.
- E-commerce
- Authenticated experience
That said, Next.js is a great stack for "Static + Client Side Auth" experiences due to its SPA-like next/link routing, which negates usual page-load flashes of unstyled content with this pattern, and React + data fetching patterns should handle arbitrary state readiness and query data as needed.
We can always use SSR for authenticated experiences, and unless traffic is exceptional, there shouldn't be too many problems scaling this out.
- next.js
- typescript
- storybook
- chromatic
- redux toolkit? (maybe replaced by apollo)
- styled-components
./storybook
Storybook configs
./components
All React components
./graphql
GraphQL related apollo client, queries.
./pages
Next.js pages dir
./public
Next.js public static dir
./redux
Redux toolkit store, reducers, etc.
./stories
Storybook stories that aren't colocated
./styles
Styles that aren't colocated
./types
Types that aren't colocated
- In file e.g. type X = {}
- In component dir e.g. types.ts
- In least common ancestor dir e.g. /folder-with-child-components/types.ts
- In global types dir e.g. /types/*.ts
Let's use an ultra-light GitHub flow branching process.
There's only one rule: anything in the main branch is always deployable.
A note on the ubiquitous git-flow in 2020:
If your team is doing continuous delivery of software, I would suggest to adopt a much simpler workflow (like GitHub flow) instead of trying to shoehorn git-flow into your team. (Source)
Let's make sure main and develop can't be pushed to.
- Create new branch
- Submit pull request against
develop - (optional) Review CI Chromatic storybook deployment
- (optional) Review CI Chromatic pixel snapshot diffs
- (optional) Review CI Next.js build (OOTB Vercel, manual implementation self hosted)
- Ensure rollback process defined and ready
- Run tests (human or automated) against
developCD branch & site - Automated remote integration tests should be run on
mainanddevelopsite - Merge
developtomainwhen approved triggering production build
TDD is not a requirement, but testing should be leveraged for maximum bang for the buck.
On a case by case basis, unit testing, snapshot testing, and integration testing via react testing library should be used.
Puppeteer remote testing on the production and develop site is likely worthwhile using broad strokes to ensure tests are not fragile and provide maximum coverage with the lowest time investment in implementation and maintenance.
Every targeted element in a test should have a test- prefix in the DOM, communicating to the developer/user there is a test dependency, and ensuring no arbitrary selectors are used in remote testing (reducing confidence).
Vercel.com by Next.js is great for no-config deployment with tight Next.js coupling/patterns.
It delivers quite a lot of features with low development overhead.
https://vercel.com/docs/concepts/limits/overview
If self hosting, infrastructure needs will need to be handled by another party.
Features desired
- Automated deployments from
main,developbranches - Rollbacks nice
- Automated deployments for pull requests & changes to PR branches (or all branches)
Requirements TBD.
Generally speaking, SEO deliverables should be lead by a separate party.
Search engines still do not reliably parse SPAs or client side code (especially non-Google) and they require markup on page load via Next.js static/SSR or crawler-specific pre-rendering if using client side rendering of critical data.
Pre-rendering: https://developers.google.com/search/docs/advanced/javascript/dynamic-rendering
Requirements TBD.
Browser support?
- IE11?