nuxt-node20
This commit is contained in:
parent
04083d4d1e
commit
f6c04938a5
@ -9,11 +9,10 @@ import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
|
||||
:::note
|
||||
|
||||
This was tested against `next v13.4.4` on 2023 May 26.
|
||||
|
||||
:::
|
||||
NextJS is a server-side framework for building static and dynamic sites. For
|
||||
pure static sites, [Webpack loaders](/docs/demos/static/webpack) can preprocess
|
||||
files and NextJS can build static pages from spreadsheets. For dynamic sites,
|
||||
NextJS lifecycle methods can read files on the server side.
|
||||
|
||||
The [NodeJS module](/docs/getting-started/installation/nodejs) can be imported
|
||||
from pages or loaded in Webpack loaders.
|
||||
@ -50,6 +49,33 @@ module.exports = {
|
||||
|
||||
:::
|
||||
|
||||
:::warning Telemetry
|
||||
|
||||
NextJS collects telemetry by default. The `telemetry` subcommand can disable it:
|
||||
|
||||
```js
|
||||
npx next@13.4.4 telemetry disable
|
||||
```
|
||||
|
||||
The setting can be verified by running
|
||||
|
||||
```js
|
||||
npx next@13.4.4 telemetry status
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
:::note
|
||||
|
||||
The following deployments were tested:
|
||||
|
||||
| NextJS | Date |
|
||||
|:-------|:-----------|
|
||||
| 13.1.1 | 2023-01-14 |
|
||||
| 13.4.4 | 2023-05-26 |
|
||||
|
||||
:::
|
||||
|
||||
## Loading Data
|
||||
|
||||
At a high level, there are two ways to pull spreadsheet data into NextJS apps:
|
||||
|
@ -10,14 +10,49 @@ import CodeBlock from '@theme/CodeBlock';
|
||||
`@nuxt/content` is a file-based CMS for Nuxt, enabling static-site generation
|
||||
and on-demand server rendering powered by spreadsheets.
|
||||
|
||||
The [NodeJS module](/docs/getting-started/installation/nodejs) can be imported
|
||||
from Content v1 "parsers" and Content v2 "transformers".
|
||||
|
||||
:::note
|
||||
|
||||
The following deployments were tested:
|
||||
|
||||
| Nuxt Content | Nuxt | Date |
|
||||
|:-------------|:---------|:-----------|
|
||||
| `1.15.1` | `2.16.3` | 2023-04-06 |
|
||||
| `1.15.1` | `2.16.3` | 2023-06-01 |
|
||||
| `2.3.0` | `3.0.0` | 2023-01-19 |
|
||||
| `2.6.0` | `3.5.2` | 2023-06-01 |
|
||||
|
||||
:::
|
||||
|
||||
:::caution Telemetry
|
||||
|
||||
Nuxt embeds telemetry. According to the developers, it is disabled by default.
|
||||
To explicitly disable telemetry, the official documentation recommends:
|
||||
|
||||
```bash
|
||||
npx nuxt telemetry disable
|
||||
```
|
||||
|
||||
At the time the demo was last tested, this command did not work. Instead, a
|
||||
option should be added in `nuxt.config.ts` or `nuxt.config.js` for Nuxt 3 sites:
|
||||
|
||||
```js
|
||||
// ...
|
||||
// highlight-start
|
||||
export default defineNuxtConfig({
|
||||
// @ts-ignore
|
||||
telemetry: false,
|
||||
// highlight-end
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
A global setting can be added to `.nuxtrc` in the user home directory:
|
||||
|
||||
```ini title=".nuxtrc"
|
||||
telemetry.enabled=false
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
@ -54,7 +89,7 @@ const parseSheet = (file, { path }) => {
|
||||
const wb = readFile(path);
|
||||
const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
|
||||
return { data: o };
|
||||
}
|
||||
};
|
||||
|
||||
export default {
|
||||
// ...
|
||||
@ -109,15 +144,32 @@ neatly with nested `v-for`:
|
||||
|
||||
### Nuxt Content Demo
|
||||
|
||||
:::caution
|
||||
|
||||
When the demo was last tested, parts of the Nuxt dependency tree did not support
|
||||
NodeJS version 20. The creation step will show warnings like
|
||||
|
||||
```
|
||||
npm WARN EBADENGINE Unsupported engine {
|
||||
npm WARN EBADENGINE package: '@nuxt/types@2.16.3',
|
||||
npm WARN EBADENGINE required: { node: '^14.18.0 || ^16.10.0 || ^17.0.0 || ...
|
||||
npm WARN EBADENGINE current: { node: 'v20.2.0', npm: '9.6.6' }
|
||||
npm WARN EBADENGINE }
|
||||
```
|
||||
|
||||
The recommended solution is to switch to Node 18.
|
||||
|
||||
:::
|
||||
|
||||
1) Create a stock app:
|
||||
|
||||
```bash
|
||||
npx create-nuxt-app@4.0.0 SheetJSNuxt
|
||||
npx create-nuxt-app@4.0.0 sheetjs-nuxt
|
||||
```
|
||||
|
||||
When prompted, enter the following options:
|
||||
|
||||
- `Project name`: press Enter (use default `SheetJSNuxt`)
|
||||
- `Project name`: press Enter (use default `sheetjs-nuxt`)
|
||||
- `Programming language`: press Down Arrow (`TypeScript` selected) then Enter
|
||||
- `Package manager`: select `Npm` and press Enter
|
||||
- `UI framework`: select `None` and press Enter
|
||||
@ -135,7 +187,7 @@ The project will be configured and modules will be installed.
|
||||
2) Install the SheetJS library and start the server:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
cd SheetJSNuxt
|
||||
cd sheetjs-nuxt
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
|
||||
npm run dev`}
|
||||
</CodeBlock>
|
||||
@ -167,7 +219,7 @@ const parseSheet = (file, { path }) => {
|
||||
const wb = readFile(path);
|
||||
const o = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
|
||||
return { data: o };
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
- Look for the exported object. There should be a `content` property:
|
||||
@ -283,7 +335,8 @@ the library hard-codes UTF-8 interpretations, the `_id` field currently uses
|
||||
the pattern `content:` followed by the filename (if files are placed in the
|
||||
`content` folder directly). This enables a transformer to re-read the file:
|
||||
|
||||
```ts
|
||||
```ts title="Transformer"
|
||||
// @ts-ignore
|
||||
import { defineTransformer } from "@nuxt/content/transformers/utils";
|
||||
import { read, utils } from "xlsx";
|
||||
import { readFileSync } from "node:fs";
|
||||
@ -293,7 +346,13 @@ export default defineTransformer({
|
||||
name: 'sheetformer',
|
||||
extensions: ['.xlsx'],
|
||||
parse (_id: string, rawContent: string) {
|
||||
const wb = read(readFileSync(resolve("./content/" + _id.slice(8))));
|
||||
// highlight-start
|
||||
/* read the underlying file */
|
||||
const buf = readFileSync(resolve("./content/" + _id.slice(8)));
|
||||
/* parse */
|
||||
const wb = read(buf);
|
||||
// highlight-end
|
||||
/* generate JS objects for each worksheet */
|
||||
const body = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
|
||||
return { _id, body };
|
||||
}
|
||||
@ -302,7 +361,7 @@ export default defineTransformer({
|
||||
|
||||
Pages can pull data using `useAsyncData`:
|
||||
|
||||
```html
|
||||
```html title="Page"
|
||||
<script setup>
|
||||
const key = "pres"; // matches pres.xlsx
|
||||
const {data} = await useAsyncData('x', ()=>queryContent(`/${key}`).findOne());
|
||||
@ -312,7 +371,7 @@ const {data} = await useAsyncData('x', ()=>queryContent(`/${key}`).findOne());
|
||||
|
||||
Pages should use `ContentRenderer` to reference the data:
|
||||
|
||||
```html
|
||||
```html title="Page"
|
||||
<template><ContentRenderer :value="data">
|
||||
<!-- data.body is the array defined in the transformer -->
|
||||
<div v-for="item in data.body" v-bind:key="item.name">
|
||||
@ -332,20 +391,33 @@ Pages should use `ContentRenderer` to reference the data:
|
||||
|
||||
### Nuxt Content 2 Demo
|
||||
|
||||
:::caution
|
||||
|
||||
When the demo was last tested, parts of the Nuxt dependency tree did not support
|
||||
NodeJS version 20. If the `yarn install` step fails with a message like
|
||||
|
||||
```
|
||||
error @nuxt/kit@3.4.1: The engine "node" is incompatible with this module.
|
||||
```
|
||||
|
||||
The recommended solution is to switch to Node 18.
|
||||
|
||||
:::
|
||||
|
||||
1) Create a stock app and install dependencies:
|
||||
|
||||
```bash
|
||||
npx nuxi init -t content sheetjs-nc2
|
||||
npx -y nuxi init -t content sheetjs-nc2
|
||||
cd sheetjs-nc2
|
||||
npx yarn install
|
||||
npx yarn add --dev @types/node
|
||||
npx -y yarn install
|
||||
npx -y yarn add --dev @types/node
|
||||
```
|
||||
|
||||
2) Install the SheetJS library and start the server:
|
||||
|
||||
<CodeBlock language="bash">{`\
|
||||
npx yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
|
||||
npx yarn dev`}
|
||||
npx -y yarn add https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
|
||||
npx -y yarn dev`}
|
||||
</CodeBlock>
|
||||
|
||||
|
||||
@ -412,6 +484,8 @@ After creating the source files, the module must be added to `nuxt.config.ts`:
|
||||
import SheetJSModule from './sheetmodule'
|
||||
|
||||
export default defineNuxtConfig({
|
||||
// @ts-ignore
|
||||
telemetry: false,
|
||||
modules: [
|
||||
SheetJSModule,
|
||||
'@nuxt/content'
|
||||
@ -423,9 +497,9 @@ export default defineNuxtConfig({
|
||||
Restart the dev server by exiting the process (Control+C) and running:
|
||||
|
||||
```bash
|
||||
npx nuxi clean
|
||||
npx nuxi typecheck
|
||||
npx yarn run dev
|
||||
npx -y nuxi clean
|
||||
npx -y nuxi typecheck
|
||||
npx -y yarn run dev
|
||||
```
|
||||
|
||||
Loading `http://localhost:3000/pres` should show some JSON data:
|
||||
@ -469,8 +543,8 @@ const {data} = await useAsyncData('s5s', () => queryContent('/pres').findOne());
|
||||
Restart the dev server by exiting the process (Control+C) and running:
|
||||
|
||||
```bash
|
||||
npx nuxi clean
|
||||
npx yarn run dev
|
||||
npx -y nuxi clean
|
||||
npx -y yarn run dev
|
||||
```
|
||||
|
||||
The browser should now display an HTML table.
|
||||
@ -483,13 +557,13 @@ The page should automatically refresh with the new content.
|
||||
7) Stop the server (press `CTRL+C` in the terminal window) and run
|
||||
|
||||
```bash
|
||||
npx yarn run generate
|
||||
npx -y yarn run generate
|
||||
```
|
||||
|
||||
This will create a static site in `.output/public`, which can be served with:
|
||||
|
||||
```bash
|
||||
npx http-server .output/public
|
||||
npx -y http-server .output/public
|
||||
```
|
||||
|
||||
Accessing `http://localhost:8080/pres` will show the page contents. Verifying
|
||||
|
@ -33,6 +33,16 @@ flowchart LR
|
||||
aoo --> |index.astro\ntemplate body| html
|
||||
```
|
||||
|
||||
:::warning Telemetry
|
||||
|
||||
Astro enables telemetry by default. The tool has an option to disable telemetry:
|
||||
|
||||
```bash
|
||||
npx astro telemetry disable
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Integration
|
||||
|
||||
:::note
|
||||
|
Loading…
Reference in New Issue
Block a user