NextJS Static demo refresh

This commit is contained in:
SheetJS 2024-06-07 21:37:27 -04:00
parent 67294eeeae
commit a5e01f9476
5 changed files with 142 additions and 44 deletions

@ -53,8 +53,26 @@ Typically, some users will create a spreadsheet with source data that should be
loaded into the site. This sheet will have known columns. For example, "Name"
and "Index" are used in [`pres.xlsx`](https://docs.sheetjs.com/pres.xlsx):
<table>
<thead><tr><th>Spreadsheet</th><th>State</th></tr></thead>
<tbody><tr><td>
![`pres.xlsx` data](pathname:///pres.png)
</td><td>
```js
[
{ Name: "Bill Clinton", Index: 42 },
{ Name: "GeorgeW Bush", Index: 43 },
{ Name: "Barack Obama", Index: 44 },
{ Name: "Donald Trump", Index: 45 },
{ Name: "Joseph Biden", Index: 46 }
]
```
</td></tr></tbody></table>
This naturally maps to an array of typed objects, as in the TS example below:
```ts
@ -71,18 +89,6 @@ const data = utils.sheet_to_json<President>(wb.Sheets[wb.SheetNames[0]]);
console.log(data);
```
`data` will be an array of objects:
```js
[
{ Name: "Bill Clinton", Index: 42 },
{ Name: "GeorgeW Bush", Index: 43 },
{ Name: "Barack Obama", Index: 44 },
{ Name: "Donald Trump", Index: 45 },
{ Name: "Joseph Biden", Index: 46 }
]
```
A component will typically map over the data. The following example generates
a TABLE with a row for each President:
@ -135,9 +141,9 @@ function exportFile() {
This demo was tested in the following environments:
| Svelte | ViteJS | Date |
|:--------|:--------|:-----------|
| `4.2.8` | `5.0.5` | 2023-12-04 |
| SvelteJS | ViteJS | Date |
|:---------|:---------|:-----------|
| `4.2.18` | `5.2.13` | 2024-06-07 |
:::
@ -235,9 +241,9 @@ function exportFile() {
This demo was tested in the following environments:
| Svelte | ViteJS | Date |
|:--------|:--------|:-----------|
| `4.2.8` | `5.0.5` | 2023-12-04 |
| SvelteJS | ViteJS | Date |
|:---------|:---------|:-----------|
| `4.2.18` | `5.2.13` | 2024-06-07 |
:::

@ -47,8 +47,19 @@ This demo was tested in the following environments:
| ESBuild | Date |
|:----------|:-----------|
| `0.14.14` | 2023-12-04 |
| `0.19.8` | 2023-12-04 |
| `0.21.4` | 2024-06-07 |
| `0.20.2` | 2024-06-07 |
| `0.19.12` | 2024-06-07 |
| `0.18.20` | 2024-06-07 |
| `0.17.19` | 2024-06-07 |
| `0.16.17` | 2024-06-07 |
| `0.15.18` | 2024-06-07 |
| `0.14.54` | 2024-06-07 |
| `0.13.15` | 2024-06-07 |
| `0.12.29` | 2024-06-07 |
| `0.11.23` | 2024-06-07 |
| `0.10.2` | 2024-06-07 |
| `0.9.7` | 2024-06-07 |
:::

@ -36,13 +36,13 @@ time and how to read files on the server in NextJS lifecycle methods.
NextJS collects telemetry by default. The `telemetry` subcommand can disable it:
```js
npx next@13.5.6 telemetry disable
npx -y next@13.5.6 telemetry disable
```
The setting can be verified by running
```js
npx next@13.5.6 telemetry status
npx -y next@13.5.6 telemetry status
```
:::
@ -75,12 +75,26 @@ This demo was tested in the following environments:
| NextJS | NodeJS | Date |
|:----------|:----------|:-----------|
| ` 9.5.5` | `16.20.2` | 2023-12-04 |
| `10.2.3` | `16.20.2` | 2023-12-04 |
| `11.1.4` | `16.20.2` | 2023-12-04 |
| `12.3.4` | `20.10.0` | 2023-12-04 |
| `13.5.6` | `20.10.0` | 2023-12-04 |
| `14.0.3` | `20.10.0` | 2023-12-04 |
| ` 9.5.5` | `16.20.2` | 2024-06-07 |
| `10.2.3` | `16.20.2` | 2024-06-07 |
| `11.1.4` | `16.20.2` | 2024-06-07 |
| `12.3.4` | `20.14.0` | 2024-06-07 |
| `13.5.6` | `20.14.0` | 2024-06-07 |
| `14.2.3` | `20.14.0` | 2024-06-07 |
:::
:::info pass
SheetJS libraries work in legacy NextJS apps. Older versions of this demo have
been tested against versions `3.2.3`, `4.2.3`, `5.1.0`, `6.1.2` and `7.0.3`.
NextJS has made a number of breaking changes over the years. Older versions of
NextJS use legacy versions of ReactJS that do not support function components
and other idioms.
[`examples/reactjs-legacy`](https://git.sheetjs.com/examples/reactjs-legacy) on
the SheetJS git server includes code samples for legacy NextJS versions.
:::
@ -554,13 +568,13 @@ When upgrading NextJS is not an option, NodeJS should be downgraded to v16.
0) Disable NextJS telemetry:
```js
npx next@13.5.6 telemetry disable
npx -y next@13.5.6 telemetry disable
```
Confirm it is disabled by running
```js
npx next@13.5.6 telemetry status
npx -y next@13.5.6 telemetry status
```
1) Set up folder structure. At the end, a `pages` folder with a `sheets`
@ -583,7 +597,7 @@ curl -LO https://docs.sheetjs.com/next/sheetjs.xlsx
:::note pass
The `next@13.5.6` dependency can be adjusted to pick a different version. For
The `next@13.5.6` depefndency can be adjusted to pick a different version. For
example, NextJS `12.3.4` is installed with
<CodeBlock language="bash">{`\
@ -699,6 +713,13 @@ As explained in the summary, the `/getStaticPaths` and `/getStaticProps` routes
are completely static. 2 `/sheets/#` pages were generated, corresponding to 2
worksheets in the file. `/getServerSideProps` is server-rendered.
:::info pass
NextJS historically used lowercase Lambda (`λ`) to denote dynamic paths. This
was changed to a stylized lowercase F (`ƒ`) in recent versions of NextJS.
:::
9) Try to build a static site:
<Tabs groupId="nextver">
@ -741,7 +762,13 @@ This build will fail. A static page cannot be generated at this point because
### Static Site
10) Delete `pages/getServerSideProps.js` and rebuild:
10) Delete `pages/getServerSideProps.js`:
```bash
rm -f pages/getServerSideProps.js
```
11) Rebuild the static site:
<Tabs groupId="nextver">
<TabItem value="13" label="NextJS 9 - 13">
@ -758,17 +785,16 @@ module.exports = {
webpack: (config) => {
```
After editing `next.config.js`:
After editing `next.config.js`, run the build command:
</TabItem>
</Tabs>
```bash
rm -f pages/getServerSideProps.js
npx next build
```
Inspecting the output, there should be no lines with the `λ` symbol:
Inspecting the output, there should be no lines with `λ` or `ƒ`:
```
Route (pages) Size First Load JS
@ -782,7 +808,7 @@ Route (pages) Size First Load JS
└ /sheets/1
```
11) Generate the static site:
12) Generate the static site:
<Tabs groupId="nextver">
<TabItem value="13" label="NextJS 9 - 13">
@ -814,7 +840,7 @@ npx next build
The static site will be written to the `out` subfolder
12) Serve the static site:
13) Serve the static site:
```bash
npx http-server out
@ -825,16 +851,16 @@ testing the generated site. Note that `/getServerSideProps` will 404 since the
page was removed.
[^1]: See the ["Webpack" asset module demo](/docs/demos/static/webpack) for more details.
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options)
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options).
[^3]: See ["SheetJS Data Model"](/docs/csf/) for more details.
[^4]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output)
[^5]: See [`readFile` in "Reading Files"](/docs/api/parse-options)
[^6]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output)
[^4]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output).
[^5]: See [`readFile` in "Reading Files"](/docs/api/parse-options).
[^6]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output).
[^7]: See [`getStaticProps`](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props) in the NextJS documentation.
[^8]: See [`getStaticPaths`](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-paths) in the NextJS documentation.
[^9]: See [`getServerSideProps`](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props) in the NextJS documentation.
[^10]: See [`fallback` in getStaticPaths](https://nextjs.org/docs/pages/api-reference/functions/get-static-paths#fallback-false) in the NextJS documentation.
[^11]: See [`sheet_to_html` in "Utilities"](/docs/api/utilities/html#html-table-output)
[^12]: [`dangerouslySetInnerHTML`](https://react.dev/reference/react-dom/components/common#common-props) is a ReactJS prop supported for all built-in components.
[^13]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output)
[^14]: See ["Array of Objects" in the ReactJS demo](/docs/demos/frontend/react#rendering-data)
[^13]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output).
[^14]: See ["Array of Objects" in the ReactJS demo](/docs/demos/frontend/react#rendering-data).

@ -190,7 +190,7 @@ Deno.writeFileSync(out_file, new TextEncoder().encode(csv));`}
:::note Tested Deployments
This was last tested by SheetJS users on 2023 December 04.
This was last tested by SheetJS users on 2024 June 07.
:::

55
tests/bundler-esbuild.sh Executable file

@ -0,0 +1,55 @@
#!/bin/bash
# https://docs.sheetjs.com/docs/demos/frontend/bundler/esbuild
cd /tmp
rm -rf sheetjs-esbrowser
mkdir sheetjs-esbrowser
cd sheetjs-esbrowser
npm init -y
npm i --save https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz
curl -LO https://docs.sheetjs.com/esbuild/esbrowser.js
curl -LO https://docs.sheetjs.com/esbuild/esbnode.js
cat >index.html <<EOF
<body><script src="esb.browser.js"></script></body>
EOF
cat >test.js <<EOF
const puppeteer = require('puppeteer');
const express = require('express');
const app = express();
app.use(express.static('./'));
app.listen(7262, async() => {
await new Promise((res,rej) => setTimeout(res, 1000));
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on("console", msg => console.log("PAGE LOG:", msg.text()));
await page.setViewport({width: 1920, height: 1080});
const client = await page.target().createCDPSession();
await client.send('Browser.setDownloadBehavior', {
behavior: 'allow',
downloadPath: require("path").resolve('./')
});
page.on('request', req => console.log(req.url()));
await page.goto('http://localhost:7262/');
await new Promise((res,rej) => setTimeout(res, 1000));
await browser.close();
process.exit();
});
EOF
for n in 0.9.7 0.10.2 0.11.23 0.12.29 0.13.15 0.14.54 0.15.18 0.16.17 0.17.19 0.18.20 0.19.12 0.20.2 0.21.4; do
npx -y esbuild@$n --version
## Browser Test
npx -y esbuild@$n esbrowser.js --bundle --outfile=esb.browser.js
node test.js
npx -y xlsx-cli Presidents.xlsx | head -n 3
rm -f esb.browser.js Presidents.xlsx
npx -y esbuild@$n esbnode.js --bundle --platform=node --outfile=esb.node.js
node esb.node.js
npx -y xlsx-cli Presidents.xlsx | head -n 3
rm -f esb.node.js Presidents.xlsx
done