New vite-based examples app (#1226)
Right now this examples app looks exactly the same as our old examples app, but there are a couple of tiny differences: - We use `vite` instead of our own esbuild setup for development and bundling - We use `@tldraw/assets` for smart asset hashing instead of copying the assets to a public folder You can use `@tldraw/assets` with vite with a bunch of extra config, but it (plus a bunch of other bundlers) also support a special syntax for specifying asset urls: `new URL('./my/asset.svg', import.meta.url).href`. This approach is more standards-complient, but doesn't work with every bundler just yet. This diff also adds a url-based version of `@tldraw/assets`, although I'd like to tweak the entry point - right now you need to import from `@tldraw/assets/lib/urls`, but i'd like to find a way to get this to `@tldraw/assets/urls` or something at some point. There are a couple other extra fixes in here: - vscode builds were broken, they're fixed now! - there's also a little tweak to the `getBundlerAssetUrls` API to allow passing in a function instead of an object for URL formatting - there are new internal-only functions for injecting asset urls globally instead of passing them in via react props. this means we can get the benefits of cacheable URLs without having to clutter our examples by passing them in
This commit is contained in:
parent
c76dc1596f
commit
880f82e658
42 changed files with 1303 additions and 1187 deletions
|
@ -1,4 +1,5 @@
|
|||
import { readFile, writeFile as writeFileUnchecked } from 'fs/promises'
|
||||
import json5 from 'json5'
|
||||
import { basename, dirname, join, relative } from 'path'
|
||||
import prettier from 'prettier'
|
||||
import { fileURLToPath } from 'url'
|
||||
|
@ -10,11 +11,11 @@ export const REPO_ROOT = join(__dirname, isBublic ? '../../..' : '../..')
|
|||
export const BUBLIC_ROOT = join(__dirname, '../..')
|
||||
|
||||
export async function readJsonIfExists(file: string) {
|
||||
try {
|
||||
return JSON.parse(await readFile(file, 'utf8'))
|
||||
} catch {
|
||||
const fileContents = await readFileIfExists(file)
|
||||
if (fileContents === null) {
|
||||
return null
|
||||
}
|
||||
return json5.parse(fileContents)
|
||||
}
|
||||
|
||||
export async function readFileIfExists(file: string) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue