forked from sheetjs/docs.sheetjs.com
		
	astro-demo
This commit is contained in:
		
							parent
							
								
									ad5220e146
								
							
						
					
					
						commit
						f11ac3bbaf
					
				| @ -11,9 +11,9 @@ from the ViteJS demo. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| Astro is a site generator.  Astro projects use ViteJS under the hood, and Astro | ||||
| exposes project configuration through the `vite` property in `astro.config.mjs`. | ||||
| The [ViteJS demo](/docs/demos/static/vitejs) examples work as expected! | ||||
| Astro is a site generator. Astro projects use ViteJS under the hood. They expose | ||||
| project configuration through the `vite` property in `astro.config.mjs`. The | ||||
| [ViteJS demo](/docs/demos/static/vitejs) examples work as expected! | ||||
| 
 | ||||
| ## Integration | ||||
| 
 | ||||
| @ -29,7 +29,7 @@ use the Base64 string loader to get file data and parse with the SheetJS library | ||||
| in the relevant pages.  If the SheetJS operations are performed in frontmatter, | ||||
| only the results will be added to the generated pages! | ||||
| 
 | ||||
| #### Loader | ||||
| ### Loader | ||||
| 
 | ||||
| The loader should be added to `astro.config.mjs` under the `vite` key. | ||||
| 
 | ||||
| @ -73,7 +73,7 @@ declare module '*.xlsx' { | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| #### Astro Frontmatter | ||||
| ### Astro Frontmatter | ||||
| 
 | ||||
| Typically projects store files in `src/pages`. Assuming `pres.numbers` is stored | ||||
| in the `src/data` directory in the project, the relative import | ||||
| @ -118,3 +118,150 @@ const data = utils.sheet_to_json<IPresident>(wb.Sheets[wb.SheetNames[0]]); | ||||
| 
 | ||||
| When built using `npx astro build`, Astro 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 February 21 using AstroJS `v2.0.14` | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 0) Disable Astro telemetry: | ||||
| 
 | ||||
| ```bash | ||||
| npx astro telemetry disable | ||||
| ``` | ||||
| 
 | ||||
| 1) Create a new site using the `docs` template: | ||||
| 
 | ||||
| ```bash | ||||
| npm create astro@latest -- --template docs --yes ./sheetjs-astro | ||||
| cd sheetjs-astro | ||||
| ``` | ||||
| 
 | ||||
| 2) Fetch the example file [`pres.numbers`](https://sheetjs.com/pres.numbers): | ||||
| 
 | ||||
| ```bash | ||||
| mkdir -p src/data | ||||
| curl -Lo src/data/pres.numbers https://sheetjs.com/pres.numbers | ||||
| ``` | ||||
| 
 | ||||
| 3) Install the SheetJS library: | ||||
| 
 | ||||
| ```bash | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| ``` | ||||
| 
 | ||||
| 4) Replace `src/pages/index.astro` with the following: | ||||
| 
 | ||||
| ```jsx title="src/pages/index.astro" | ||||
| --- | ||||
| /* -- the code in the frontmatter is only run at build time -- */ | ||||
| import { read, utils } from "xlsx"; | ||||
| 
 | ||||
| /* parse workbook */ | ||||
| import b64 from "../data/pres.numbers"; | ||||
| const wb = read(b64, {type: "base64"}); | ||||
| 
 | ||||
| /* generate row objects */ | ||||
| interface IPresident { | ||||
|   Name: string; | ||||
|   Index: number; | ||||
| } | ||||
| const data = utils.sheet_to_json<IPresident>(wb.Sheets[wb.SheetNames[0]]); | ||||
| --- | ||||
| <html> | ||||
|   <body> | ||||
|     <h3>Presidents</h3> | ||||
|     <table> | ||||
|       <thead><tr><th>Name</th><th>Index</th></tr></thead> | ||||
|       <tbody> | ||||
|       {data.map(row => (<tr> | ||||
|         <td>{row.Name}</td><td>{row.Index}</td> | ||||
|       </tr>))} | ||||
|       </tbody> | ||||
|     </table> | ||||
|   </body> | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| 5) Append the following lines to `src/env.d.ts`: | ||||
| 
 | ||||
| ```ts title="src/env.d.ts" | ||||
| /* add to the end of the file */ | ||||
| declare module '*.numbers' { | ||||
|     const data: string; | ||||
|     export default data; | ||||
| } | ||||
| declare module '*.xlsx' { | ||||
|     const data: string; | ||||
|     export default data; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| 6) Add the highlighted lines to `astro.config.mjs`: | ||||
| 
 | ||||
| ```js title="astro.config.mjs" | ||||
| export default defineConfig({ | ||||
|   // highlight-start | ||||
|   vite: { | ||||
|     // this tells astro which extensions to handle | ||||
|     assetsInclude: ['**/*.numbers', '**/*.xlsx'], | ||||
| 
 | ||||
|     plugins: [ | ||||
|       { // this plugin presents the data as a Base64 string | ||||
|         name: "sheet-base64", | ||||
|         transform(code, id) { | ||||
|           if(!id.match(/\.(numbers|xlsx)$/)) return; | ||||
|           var data = readFileSync(id, "base64"); | ||||
|           return `export default '${data}'`; | ||||
|         } | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   // highlight-end | ||||
|   integrations: [ | ||||
| ``` | ||||
| 
 | ||||
| 7) Build the static site: | ||||
| 
 | ||||
| ```bash | ||||
| npx astro build | ||||
| ``` | ||||
| 
 | ||||
| AstroJS will place the generated site in the `dist` subfolder. | ||||
| 
 | ||||
| 8) Start a web server to host the static site: | ||||
| 
 | ||||
| ```bash | ||||
| npx http-server dist | ||||
| ``` | ||||
| 
 | ||||
| Open a web browser and access the displayed URL (usually http://localhost:8080). | ||||
| View the webpage source and confirm that no JS was added to the page.  It only | ||||
| contains the content from the file in an HTML table: | ||||
| 
 | ||||
| ```html | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <body> | ||||
|     <h3>Presidents</h3> | ||||
|     <table> | ||||
|       <thead><tr><th>Name</th><th>Index</th></tr></thead> | ||||
|       <tbody> | ||||
|       <tr> | ||||
|         <td>Bill Clinton</td><td>42</td> | ||||
|       </tr><tr> | ||||
|         <td>GeorgeW Bush</td><td>43</td> | ||||
|       </tr><tr> | ||||
|         <td>Barack Obama</td><td>44</td> | ||||
|       </tr><tr> | ||||
|         <td>Donald Trump</td><td>45</td> | ||||
|       </tr><tr> | ||||
|         <td>Joseph Biden</td><td>46</td> | ||||
|       </tr> | ||||
|       </tbody> | ||||
|     </table> | ||||
|   </body></html> | ||||
| ``` | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user