sveltekit
This commit is contained in:
parent
514ed5f76d
commit
36361013e4
@ -6,6 +6,7 @@ sidebar_position: 2
|
||||
import current from '/version.js';
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
|
||||
# Tutorial
|
||||
|
||||
|
@ -14,6 +14,7 @@ familiarity is assumed.
|
||||
|
||||
Other demos cover general Svelte deployments, including:
|
||||
|
||||
- [Static Site Generation powered by SvelteKit](/docs/demos/static/svelte)
|
||||
- [iOS applications powered by CapacitorJS](/docs/demos/mobile/capacitor)
|
||||
- [Desktop application powered by Wails](/docs/demos/desktop/wails)
|
||||
|
||||
|
@ -7,6 +7,7 @@ sidebar_custom_props:
|
||||
---
|
||||
|
||||
import current from '/version.js';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
|
||||
:::note
|
||||
|
||||
@ -28,7 +29,8 @@ recommended. The heavy work is performed at build time and the generated site
|
||||
only includes the raw data.
|
||||
|
||||
For more complex parsing or display logic, ["Base64 Loader"](#base64-loader) is
|
||||
preferable. Since the raw parsing logic is performed in the page,
|
||||
preferable. Since the raw parsing logic is performed in the page, the library
|
||||
will be included in the final bundle.
|
||||
|
||||
:::
|
||||
|
||||
@ -119,20 +121,20 @@ ${csv}
|
||||
|
||||
:::note
|
||||
|
||||
This demo was tested on 2023 January 14 against `vite v4.0.4`.
|
||||
This demo was tested on 2023 April 30 against `vite v4.3.3`.
|
||||
|
||||
:::
|
||||
|
||||
### Initial Setup
|
||||
|
||||
1) Create a new site using the `vue-ts` template:
|
||||
1) Create a new site with the `vue-ts` template and install the SheetJS package:
|
||||
|
||||
```bash
|
||||
<CodeBlock language="bash">{`\
|
||||
npm create vite@latest sheetjs-vite -- --template vue-ts
|
||||
cd sheetjs-vite
|
||||
npm install
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
```
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
||||
</CodeBlock>
|
||||
|
||||
2) Replace `vite.config.ts` with the following:
|
||||
|
||||
@ -214,7 +216,7 @@ npm run build
|
||||
npx http-server dist/
|
||||
```
|
||||
|
||||
The terminal will display a url like http://127.0.0.1:8080. Access that page
|
||||
The terminal will display a url like `http://127.0.0.1:8080` . Access that page
|
||||
with a web browser.
|
||||
|
||||
7) To confirm that only the raw data is present in the page, view the page
|
||||
|
237
docz/docs/03-demos/04-static/11-svelte.md
Normal file
237
docz/docs/03-demos/04-static/11-svelte.md
Normal file
@ -0,0 +1,237 @@
|
||||
---
|
||||
title: SvelteKit
|
||||
pagination_prev: demos/net/index
|
||||
pagination_next: demos/mobile/index
|
||||
---
|
||||
|
||||
import current from '/version.js';
|
||||
|
||||
:::note
|
||||
|
||||
This demo covers SvelteKit. The [Svelte demo](/docs/demos/frontend/svelte)
|
||||
covers general client-side strategies.
|
||||
|
||||
This demo uses ["Base64 Loader"](/docs/demos/static/vitejs#base64-loader)
|
||||
from the ViteJS demo.
|
||||
|
||||
:::
|
||||
|
||||
SvelteKit projects use ViteJS under the hood. They expose the `vite.config.js`
|
||||
script. The [ViteJS demo](/docs/demos/static/vitejs) examples work as expected!
|
||||
|
||||
The following diagram depicts the workbook waltz:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
file[(workbook\nfile)]
|
||||
subgraph SheetJS operations
|
||||
base64(base64\nstring)
|
||||
aoa(array of\nobjects)
|
||||
end
|
||||
html{{HTML\nTABLE}}
|
||||
file --> |vite.config.js\ndata loader| base64
|
||||
base64 --> |+page.server.js\nload function| aoa
|
||||
aoa --> |+page.svelte\ncomponent| html
|
||||
```
|
||||
|
||||
## Integration
|
||||
|
||||
`+page.server.js` scripts can be pre-rendered by exporting `prerender` from the
|
||||
script. If the SheetJS operations are performed in the server script, only the
|
||||
results will be added to the generated pages!
|
||||
|
||||
For static site generation, `@sveltejs/adapter-static` must be used.
|
||||
|
||||
### Loader
|
||||
|
||||
:::note
|
||||
|
||||
The ViteJS demo used the query `?b64` to identify files. To play nice with
|
||||
SvelteKit, this demo matches the file extensions directly.
|
||||
|
||||
:::
|
||||
|
||||
The loader should be added to `vite.config.js`. The code is nearly identical to
|
||||
the ["Base64 Loader" ViteJS example.](/docs/demos/static/vitejs#base64-loader)
|
||||
|
||||
```js title="vite.config.js"
|
||||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import { defineConfig } from 'vite';
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
export default defineConfig({
|
||||
assetsInclude: ['**/*.numbers', '**/*.xlsx'],
|
||||
plugins: [sveltekit(), {
|
||||
name: "sheet-base64",
|
||||
transform(code, id) {
|
||||
if(!id.match(/\.(numbers|xlsx)$/)) return;
|
||||
var data = readFileSync(id, "base64");
|
||||
return `export default '${data}'`;
|
||||
}
|
||||
}]
|
||||
});
|
||||
```
|
||||
|
||||
#### Types
|
||||
|
||||
For VSCodium integration, types can be specified in `src/app.d.ts`.
|
||||
|
||||
The example data loader returns Base64 strings. Declarations should be added for
|
||||
each file extension supported in the loader:
|
||||
|
||||
```ts title="src/app.d.ts"
|
||||
declare global {
|
||||
declare module '*.numbers' {
|
||||
const data: string;
|
||||
export default data;
|
||||
}
|
||||
declare module '*.xlsx' {
|
||||
const data: string;
|
||||
export default data;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Data Processing
|
||||
|
||||
For static sites, SheetJS operations should be run in `+page.server.js` .
|
||||
|
||||
Assuming `pres.xlsx` is stored in the `data` directory from the project root,
|
||||
the relative import
|
||||
|
||||
```js
|
||||
import b64 from "../../data/pres.xlsx"
|
||||
```
|
||||
|
||||
will return a Base64 string which can be parsed in the script. The workbook
|
||||
object can be post-processed using utility functions. The following example
|
||||
uses `sheet_to_json` to generate arrays of row objects for each worksheet. The
|
||||
data presented to the page will be an object whose keys are worksheet names:
|
||||
|
||||
```js title="src/routes/+page.server.js"
|
||||
import b64 from "../../data/pres.xlsx";
|
||||
import { read, utils } from "xlsx";
|
||||
|
||||
export const prerender = true;
|
||||
|
||||
/** @type {import('./$types').PageServerLoad} */
|
||||
export async function load({ params }) {
|
||||
const wb = read(b64);
|
||||
/** @type {[string, any[]][]} */
|
||||
const data = wb.SheetNames.map(n => [n, utils.sheet_to_json(wb.Sheets[n])]);
|
||||
return Object.fromEntries(data);
|
||||
}
|
||||
```
|
||||
|
||||
### Data Rendering
|
||||
|
||||
The shape of the data is determined by the loader. The example loader returns an
|
||||
object whose keys are worksheet names and whose values are arrays of objects.
|
||||
|
||||
Using standard Svelte patterns, HTML tables can be generated from the data:
|
||||
|
||||
```html title="src/routes/+page.svelte"
|
||||
<script>
|
||||
/** @type {import('./$types').PageData} */
|
||||
export let data;
|
||||
|
||||
/* `pres` will be the data from Sheet1 */
|
||||
/** @type {Array<{Name: string, Index: number}>}*/
|
||||
export let pres = data["Sheet1"];
|
||||
</script>
|
||||
|
||||
<h1>Presidents</h1>
|
||||
<table><thead><th>Name</th><th>Index</th></thead><tbody>
|
||||
{#each pres as p}<tr>
|
||||
<td>{p.Name}</td>
|
||||
<td>{p.Index}</td>
|
||||
</tr>{/each}
|
||||
</tbody></table>
|
||||
```
|
||||
|
||||
When built using `npm run build`, SvelteKit will perform the conversion and emit
|
||||
a simple HTML table without any reference to the existing spreadsheet file!
|
||||
|
||||
## Complete Example
|
||||
|
||||
:::note
|
||||
|
||||
This demo was tested on 2023 April 30 using SvelteKit `1.15.9`
|
||||
|
||||
:::
|
||||
|
||||
### Initial Setup
|
||||
|
||||
1) Create a new site:
|
||||
|
||||
```bash
|
||||
npm create svelte@latest sheetjs-svelte
|
||||
cd sheetjs-svelte
|
||||
npm i
|
||||
```
|
||||
|
||||
2) Fetch the example file [`pres.xlsx`](https://sheetjs.com/pres.xlsx) and move
|
||||
to a `data` subdirectory in the root of the project:
|
||||
|
||||
```bash
|
||||
mkdir -p data
|
||||
curl -Lo data/pres.xlsx https://sheetjs.com/pres.xlsx
|
||||
```
|
||||
|
||||
3) Install the SheetJS library:
|
||||
|
||||
<pre><code parentName="pre" {...{"className": "language-bash"}}>{`\
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz`}
|
||||
</code></pre>
|
||||
|
||||
4) Replace the contents of `vite.config.js` with the contents of the code block
|
||||
named [`vite.config.js` in the "Loader" section](#loader)
|
||||
|
||||
5) Append the lines from [`src/app.d.ts` snippet in the "Types" section](#types)
|
||||
to the `src/app.d.ts` file.
|
||||
|
||||
6) Replace the contents of `src/routes/+page.server.ts` with the contents of the
|
||||
code block named [`src/routes/+page.server.ts` in "Data Processing"](#data-processing)
|
||||
|
||||
7) Replace the contents of `src/routes/+page.svelte` with the contents of the
|
||||
code block named [`src/routes/+page.svelte` in "Data Rendering"](#data-rendering)
|
||||
|
||||
### Live Reload
|
||||
|
||||
8) Open `data/pres.xlsx` in a spreadsheet editor like Apple Numbers or Excel.
|
||||
|
||||
9) Start the development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Open the displayed URL (typically `http://localhost:5173`) in a web browser and
|
||||
observe that the data from the spreadsheet is displayed in the page.
|
||||
|
||||
10) In the spreadsheet, set cell A7 to `SheetJS Dev` and cell B7 to `47`. Save
|
||||
the file. After saving, the browser should automatically refresh with new data.
|
||||
|
||||
### Static Site
|
||||
|
||||
11) Stop the development server and install the static adapter:
|
||||
|
||||
```bash
|
||||
npm install --save @sveltejs/adapter-static
|
||||
```
|
||||
|
||||
12) Edit `svelte.config.js` to use the new adapter:
|
||||
|
||||
```diff title="svelte.config.js"
|
||||
-import adapter from '@sveltejs/adapter-auto';
|
||||
+import adapter from '@sveltejs/adapter-static';
|
||||
```
|
||||
|
||||
13) Build the static site:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
14) Open a web browser and access the displayed URL (`http://localhost:8080`).
|
||||
View the page source and confirm that the raw HTML table includes the data.
|
@ -10,6 +10,7 @@ sidebar_custom_props:
|
||||
import current from '/version.js';
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
|
||||
The [NodeJS Module](/docs/getting-started/installation/nodejs) can be imported
|
||||
from JavaScript code.
|
||||
@ -233,7 +234,7 @@ async function exportFile(wb) {
|
||||
|
||||
:::note
|
||||
|
||||
This demo was tested against Wails `v2.4.0` on 2023 March 18 using
|
||||
This demo was tested against Wails `v2.4.1` on 2023 April 30 using
|
||||
the Svelte TypeScript starter.
|
||||
|
||||
:::
|
||||
@ -254,12 +255,12 @@ cd sheetjs-wails
|
||||
|
||||
3) Install front-end dependencies:
|
||||
|
||||
```bash
|
||||
<CodeBlock language="bash">{`\
|
||||
cd frontend
|
||||
curl -L -o src/assets/logo.png https://sheetjs.com/sketch1024.png
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz
|
||||
cd ..
|
||||
```
|
||||
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz
|
||||
cd ..`}
|
||||
</CodeBlock>
|
||||
|
||||
4) Download source files:
|
||||
|
||||
|
@ -29,7 +29,7 @@ This demo was verified in the following deployments:
|
||||
|:----------|:-------------|:-----------|
|
||||
| Photoshop | ExtendScript | 2023-04-15 |
|
||||
| InDesign | ExtendScript | 2023-04-15 |
|
||||
| InDesign | CEP | 2023-04-24 |
|
||||
| InDesign | CEP | 2023-04-30 |
|
||||
| InDesign | UXP | 2023-04-15 |
|
||||
|
||||
:::
|
||||
@ -242,8 +242,11 @@ const wb = XLSX.read(data.data, { type: "base64" });
|
||||
0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip)
|
||||
and extract to a `com.sheetjs.data` subdirectory.
|
||||
|
||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder. In
|
||||
Windows, the folder is `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` .
|
||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder:
|
||||
|
||||
- Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\`
|
||||
- Macintosh `/Library/Application\ Support/Adobe/CEP/extensions`
|
||||
|
||||
If prompted, give administrator privileges.
|
||||
|
||||
2) Download and open [`Template.idml`](pathname:///extendscript/Template.idml)
|
||||
@ -285,8 +288,11 @@ cep.fs.writeFile(fn.data, b64, cep.encoding.Base64);
|
||||
0) Download [`com.sheetjs.data.zip`](pathname:///extendscript/com.sheetjs.data.zip)
|
||||
and extract to a `com.sheetjs.data` subdirectory.
|
||||
|
||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder. In
|
||||
Windows, the folder is `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\` .
|
||||
1) Move the entire `com.sheetjs.data` folder to the CEP extensions folder:
|
||||
|
||||
- Windows `C:\Program Files (x86)\Common Files\Adobe\CEP\extensions\`
|
||||
- Macintosh `/Library/Application\ Support/Adobe/CEP/extensions`
|
||||
|
||||
If prompted, give administrator privileges.
|
||||
|
||||
2) Download and open [`Filled.idml`](pathname:///extendscript/Filled.idml)
|
||||
@ -317,7 +323,7 @@ const storage = require("uxp").storage;
|
||||
const ufs = storage.localFileSystem;
|
||||
```
|
||||
|
||||
**Reading Files**
|
||||
### Reading Files
|
||||
|
||||
The `getFileForOpening` method resolves to a `File` object. Reading the file
|
||||
with the `binary` format returns an `ArrayBuffer` object that can be parsed:
|
||||
@ -331,7 +337,7 @@ const ab = await file.read({ format: storage.formats.binary });
|
||||
const wb = XLSX.read(ab);
|
||||
```
|
||||
|
||||
**Writing Files**
|
||||
### Writing Files
|
||||
|
||||
The `getFileForSaving` method resolves to a `File` object. The workbook should
|
||||
be written with `type: "buffer"` for compatibility with the `binary` format:
|
||||
|
@ -64,6 +64,7 @@ run in the web browser, demos will include interactive examples.
|
||||
- [`ViteJS`](/docs/demos/static/vitejs)
|
||||
- [`NextJS`](/docs/demos/static/nextjs)
|
||||
- [`NuxtJS`](/docs/demos/static/nuxtjs)
|
||||
- [`SvelteKit`](/docs/demos/static/svelte)
|
||||
|
||||
### App Extensions
|
||||
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user