Skip to content

Commit f77b894

Browse files
enhancement/issue 1343 unify around greenwood config based prerender behavior for renderer plugins (#1344)
1 parent 11f9f51 commit f77b894

File tree

15 files changed

+57
-68
lines changed

15 files changed

+57
-68
lines changed

greenwood.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default {
1111
optimization: 'inline',
1212
staticRouter: true,
1313
activeContent: true,
14+
prerender: true,
1415
plugins: [
1516
greenwoodPluginGraphQL(),
1617
greenwoodPluginPolyfills({

packages/cli/src/commands/build.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ const runProductionBuild = async (compilation) => {
1919
const adapterPlugin = compilation.config.plugins.find(plugin => plugin.type === 'adapter')
2020
? compilation.config.plugins.find(plugin => plugin.type === 'adapter').provider(compilation)
2121
: null;
22-
const shouldPrerender = prerender || prerenderPlugin.prerender;
2322

2423
if (!await checkResourceExists(outputDir)) {
2524
await fs.mkdir(outputDir, {
2625
recursive: true
2726
});
2827
}
2928

30-
if (shouldPrerender || (activeContent && shouldPrerender)) {
29+
if (prerender) {
3130
// start any of the user's server plugins if needed
3231
const servers = [...compilation.config.plugins.filter((plugin) => {
3332
return plugin.type === 'server' && !plugin.isGreenwoodDefaultPlugin;

packages/plugin-graphql/README.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ A plugin for Greenwood to support using [GraphQL](https://graphql.org/) to query
1010

1111
As of now, this plugin requires some form of [prerendering](https://www.greenwoodjs.dev/docs/reference/rendering-strategies/) either through:
1212
1. Enabling [custom imports](https://www.greenwoodjs.dev/docs/pages/server-rendering/#custom-imports), or
13-
1. Installing the [Puppeteer renderer plugin](https://github.com/ProjectEvergreen/greenwood/tree/master/packages/plugin-renderer-puppeteer).
13+
1. Installing the [Puppeteer renderer plugin](https://github.com/ProjectEvergreen/greenwood/tree/master/packages/plugin-renderer-puppeteer)
1414

1515
## Installation
1616

@@ -29,15 +29,14 @@ $ pnpm add -D @greenwood/plugin-graphql
2929

3030
## Usage
3131

32-
Add this plugin to your _greenwood.config.js_ and configure with either `prerender: true` _or_ by adding the `greenwoodPluginRendererPuppeteer` plugin.
32+
Add this plugin to your _greenwood.config.js_ and then choose your flavor. For example, this is the configuration for using Puppeteer.
3333

34-
```javascript
34+
```js
3535
import { greenwoodPluginGraphQL } from '@greenwood/plugin-graphql';
36-
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer'; // if using puppeteer
36+
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
3737

3838
export default {
39-
// ...
40-
prerender: true, // if using custom imports
39+
prerender: true,
4140
plugins: [
4241
greenwoodPluginGraphQL(),
4342
greenwoodPluginRendererPuppeteer()
@@ -95,7 +94,7 @@ customElements.define('app-header', HeaderComponent);
9594

9695
## Schema
9796

98-
The basic page schema follow the structure of the [page data]() structure. Currently, the main "API" is just a list of all pages in your _pages/_ directory, represented as a `Page` [type definition](https://graphql.org/graphql-js/basic-types/). This is called Greenwood's `graph`.
97+
The basic page schema follow the structure of the [page data](https://greenwoodjs.dev/docs/content-as-data/pages-data/) structure. Currently, the main "API" is just a list of all pages in your _pages/_ directory, represented as a `Page` [type definition](https://graphql.org/graphql-js/basic-types/). This is called Greenwood's [**graph**](https://greenwoodjs.dev/docs/reference/appendix/#graph).
9998

10099
This is what the schema looks like:
101100
```gql

packages/plugin-graphql/test/cases/query-children/greenwood.config.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ import { greenwoodPluginGraphQL } from '../../../src/index.js';
22
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
33

44
export default {
5-
title: 'GraphQL ChildrenQuery Spec',
6-
5+
prerender: true,
76
plugins: [
8-
...greenwoodPluginGraphQL(),
9-
...greenwoodPluginRendererPuppeteer() // automatically invokes prerendering
7+
greenwoodPluginGraphQL(),
8+
greenwoodPluginRendererPuppeteer()
109
]
11-
1210
};

packages/plugin-graphql/test/cases/query-collection/greenwood.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { greenwoodPluginGraphQL } from '../../../src/index.js';
22
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
33

44
export default {
5-
5+
prerender: true,
66
plugins: [
7-
...greenwoodPluginGraphQL(),
8-
...greenwoodPluginRendererPuppeteer() // automatically invokes prerendering
7+
greenwoodPluginGraphQL(),
8+
greenwoodPluginRendererPuppeteer()
99
]
1010

1111
};

packages/plugin-graphql/test/cases/query-custom-frontmatter/greenwood.config.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import { greenwoodPluginGraphQL } from '../../../src/index.js';
22
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
33

44
export default {
5-
5+
prerender: true,
66
plugins: [
7-
...greenwoodPluginGraphQL(),
8-
...greenwoodPluginRendererPuppeteer() // automatically invokes prerendering
7+
greenwoodPluginGraphQL(),
8+
greenwoodPluginRendererPuppeteer()
99
]
10-
1110
};

packages/plugin-graphql/test/cases/query-custom-schema/greenwood.config.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import { greenwoodPluginGraphQL } from '../../../src/index.js';
22
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
33

44
export default {
5-
5+
prerender: true,
66
plugins: [
7-
...greenwoodPluginGraphQL(),
8-
...greenwoodPluginRendererPuppeteer() // automatically invokes prerendering
7+
greenwoodPluginGraphQL(),
8+
greenwoodPluginRendererPuppeteer()
99
]
10-
1110
};

packages/plugin-graphql/test/cases/query-graph/greenwood.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { greenwoodPluginGraphQL } from '../../../src/index.js';
22
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
33

44
export default {
5-
5+
prerender: true,
66
plugins: [
7-
...greenwoodPluginGraphQL(),
8-
...greenwoodPluginRendererPuppeteer() // automatically invokes prerendering
7+
greenwoodPluginGraphQL(),
8+
greenwoodPluginRendererPuppeteer()
99
]
1010

1111
};

packages/plugin-renderer-lit/README.md

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,24 @@ export async function getBody() {
9898

9999
## Options
100100

101+
### Prerender
102+
103+
The plugin works with Greenwood's [**prerender**](https://greenwoodjs.dev/docs/reference/configuration/#prerender) configuration, allowing for the use of Lit's SSR renderer for [prerendering](https://greenwoodjs.dev/docs/reference/rendering-strategies/#prerendering) your content.
104+
105+
```javascript
106+
import { greenwoodPluginRendererLit } from '@greenwood/plugin-renderer-lit';
107+
108+
export default {
109+
prerender: true,
110+
111+
plugins: [
112+
greenwoodPluginRendererLit()
113+
]
114+
}
115+
```
116+
117+
> _Keep in mind you will need to make sure your Lit Web Components are isomorphic and [properly leveraging `LitElement`'s lifecycles](https://github.com/lit/lit/tree/main/packages/labs/ssr#notes-and-limitations) and browser / Node APIs accordingly for maximum compatibility and portability._
118+
101119
### Isolation Mode
102120

103121
By default, this plugin sets `isolation` mode to `true` for all SSR pages. If you want to override this, just export an `isolation` const.
@@ -116,24 +134,4 @@ In order for server-rendered components to become interactive on the client side
116134
```js
117135
// src/pages/products.js
118136
export const hydration = false; // disable Lit hydration scripts for this page
119-
```
120-
121-
### Prerender
122-
123-
The plugin provides a setting that can be used to override Greenwood's [default _prerender_](/docs/configuration/#prerender) implementation which uses [WCC](https://github.com/ProjectEvergreen/wcc), to use Lit instead.
124-
125-
```javascript
126-
import { greenwoodPluginRendererLit } from '@greenwood/plugin-renderer-lit';
127-
128-
export default {
129-
// ...
130-
131-
plugins: [
132-
greenwoodPluginRendererLit({
133-
prerender: true
134-
})
135-
]
136-
}
137-
```
138-
139-
> _Keep in mind you will need to make sure your Lit Web Components are isomorphic and [properly leveraging `LitElement`'s lifecycles](https://github.com/lit/lit/tree/main/packages/labs/ssr#notes-and-limitations) and browser / Node APIs accordingly for maximum compatibility and portability._
137+
```

packages/plugin-renderer-lit/src/index.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class LitHydrationResource extends ResourceInterface {
2424
const headSelector = isDevelopment ? `<script type="${importMapType}">` : '<head>';
2525
const hydrationSupportScriptPath = '/node_modules/@lit-labs/ssr-client/lit-element-hydrate-support.js';
2626
let body = await response.text();
27-
console.log({ body });
2827

2928
// this needs to come first before any userland code, but before any import maps
3029
// https://github.com/ProjectEvergreen/greenwood/pull/1289
@@ -57,19 +56,17 @@ class LitHydrationResource extends ResourceInterface {
5756
`);
5857
}
5958

60-
console.log({ body });
6159
return new Response(body);
6260
}
6361
}
6462

65-
const greenwoodPluginRendererLit = (options = {}) => {
63+
const greenwoodPluginRendererLit = () => {
6664
return [{
6765
type: 'renderer',
6866
name: 'plugin-renderer-lit:renderer',
6967
provider: () => {
7068
return {
71-
executeModuleUrl: new URL('./execute-route-module.js', import.meta.url),
72-
prerender: options.prerender
69+
executeModuleUrl: new URL('./execute-route-module.js', import.meta.url)
7370
};
7471
}
7572
}, {
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { greenwoodPluginRendererLit } from '../../../src/index.js';
22

33
export default {
4+
prerender: true,
45
plugins: [
5-
greenwoodPluginRendererLit({
6-
prerender: true
7-
})
6+
greenwoodPluginRendererLit()
87
]
98
};
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { greenwoodPluginRendererLit } from '../../../src/index.js';
22

33
export default {
4+
prerender: true,
45
plugins: [
5-
greenwoodPluginRendererLit({
6-
prerender: true
7-
})
6+
greenwoodPluginRendererLit()
87
]
98
};

packages/plugin-renderer-puppeteer/README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Overview
44

5-
A Greenwood plugin for using [**Puppeteer**](https://pptr.dev) as a custom [_pre-rendering_ solution](/docs/server-rendering/#render-vs-prerender). As Puppeteer is a headless browser, it provides a lot more power and capabilities for fully rendering things like Web Components, GraphQL calls, and other very browser dependent features. For more information and complete docs on Greenwood, please visit [our website](https://www.greenwoodjs.dev).
5+
A Greenwood plugin for using [**Puppeteer**](https://pptr.dev) as a custom [_prerendering_ solution](https://greenwoodjs.dev/docs/reference/rendering-strategies/#prerendering). As Puppeteer is a headless browser, it provides a lot more power and capabilities for fully rendering things like Web Components, GraphQL calls, and other very browser dependent features. For more information and complete docs on Greenwood, please visit [our website](https://www.greenwoodjs.dev).
66

77
> This package assumes you already have `@greenwood/cli` installed.
88
@@ -23,13 +23,13 @@ $ pnpm add -D @greenwood/plugin-renderer-puppeteer
2323

2424
## Usage
2525

26-
Add this plugin to your _greenwood.config.js_:
26+
Add this plugin and enable the `prerender` setting in your _greenwood.config.js_:
2727

2828
```javascript
2929
import { greenwoodPluginRendererPuppeteer } from '@greenwood/plugin-renderer-puppeteer';
3030

3131
export default {
32-
// ...
32+
prerender: true,
3333

3434
plugins: [
3535
greenwoodPluginRendererPuppeteer()
@@ -42,14 +42,15 @@ Now, when running `greenwood build`, all your pages will get run through Puppete
4242
## Caveats
4343

4444
### Limitations
45-
Given this plugin instruments an entire browser, this plugin _only_ supports Greenwood's [`prerender` configuration](/docs/configuration/#prerender) option and so will NOT be viable for any [SSR](/docs/server-rendering/) or [Serverless and Edge](https://github.com/ProjectEvergreen/greenwood/discussions/626) features. Instead, Greenwood will be focusing on making [**WCC**](https://github.com/ProjectEvergreen/wcc) the default and recommended first-party solution.
45+
46+
Given this plugin instruments an entire browser, this plugin _only_ works with Greenwood's [`prerender` configuration](https://greenwoodjs.dev/docs/reference/configuration/#prerender) option and so will NOT be viable for any of Greenwood's [SSR or Serverless](https://greenwoodjs.dev/docs/pages/server-rendering/) capabilities. Instead, Greenwood will be focusing on making [**WCC**](https://github.com/ProjectEvergreen/wcc) the default and recommended first-party solution.
4647

4748
In addition, **puppeteer** also leverages npm `postinstall` scripts which in some environments, like [Stackblitz](https://github.com/ProjectEvergreen/greenwood/discussions/639), would be disabled and so [YMMV](https://dictionary.cambridge.org/us/dictionary/english/ymmv).
4849

4950

5051
### Dependencies
5152

52-
You may need to install additional Operating System level libraries and dependencies depending on the system you are running on to support headless Chrome. For example, for a Docker based environment like [GitHub Actions](https://github.com/ProjectEvergreen/greenwood/blob/master/.github/workflows/master.yml#L19), you would need to add [this below setup script (or similar)](https://github.com/ProjectEvergreen/greenwood/blob/master/.github/workflows/chromium-lib-install.sh) to your runner
53+
You may need to install additional Operating System level libraries and dependencies depending on the system you are running on to support headless Chrome. For example, for a Docker based environment like [GitHub Actions](https://github.com/ProjectEvergreen/greenwood/blob/master/.github/workflows/ci.yml#L19), you would need to add [this below setup script (or similar)](https://github.com/ProjectEvergreen/greenwood/blob/master/.github/workflows/chromium-lib-install.sh) to your runner
5354
```shell
5455
#!/usr/bin/bash
5556

packages/plugin-renderer-puppeteer/src/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ const greenwoodPluginRendererPuppeteer = (options = {}) => {
1515
name: 'plugin-renderer-puppeteer:renderer',
1616
provider: () => {
1717
return {
18-
customUrl: new URL('./puppeteer-handler.js', import.meta.url),
19-
prerender: true
18+
customUrl: new URL('./puppeteer-handler.js', import.meta.url)
2019
};
2120
}
2221
}];
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { greenwoodPluginRendererPuppeteer } from '../../../src/index.js';
22

33
export default {
4+
prerender: true,
45
plugins: [
5-
...greenwoodPluginRendererPuppeteer()
6+
greenwoodPluginRendererPuppeteer()
67
]
78
};

0 commit comments

Comments
 (0)