feat(asset): support for WebAssembly in the main process
This commit is contained in:
parent
4989595464
commit
b3208d3dae
6
node.d.ts
vendored
6
node.d.ts
vendored
|
@ -21,3 +21,9 @@ declare module '*.node' {
|
||||||
const node: any
|
const node: any
|
||||||
export default node
|
export default node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// node wasm
|
||||||
|
declare module '*.wasm?loader' {
|
||||||
|
const loadWasm: (options?: WebAssembly.Imports) => Promise<WebAssembly.Instance>
|
||||||
|
export default loadWasm
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import MagicString from 'magic-string'
|
||||||
import { cleanUrl, parseRequest, getHash, toRelativePath } from '../utils'
|
import { cleanUrl, parseRequest, getHash, toRelativePath } from '../utils'
|
||||||
|
|
||||||
interface AssetResolved {
|
interface AssetResolved {
|
||||||
type: 'asset' | 'native'
|
type: 'asset' | 'native' | 'wasm'
|
||||||
file: string
|
file: string
|
||||||
query: Record<string, string> | null
|
query: Record<string, string> | null
|
||||||
}
|
}
|
||||||
|
@ -31,12 +31,33 @@ function resolveAsset(id: string): AssetResolved | null {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file.endsWith('.wasm')) {
|
||||||
|
return {
|
||||||
|
type: 'wasm',
|
||||||
|
file,
|
||||||
|
query
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const nodeAssetRE = /__VITE_NODE_ASSET__([a-z\d]{8})__/g
|
const nodeAssetRE = /__VITE_NODE_ASSET__([a-z\d]{8})__/g
|
||||||
const nodePublicAssetRE = /__VITE_NODE_PUBLIC_ASSET__([a-z\d]{8})__/g
|
const nodePublicAssetRE = /__VITE_NODE_PUBLIC_ASSET__([a-z\d]{8})__/g
|
||||||
|
|
||||||
|
const wasmHelperId = '\0__electron-vite-wasm-helper'
|
||||||
|
|
||||||
|
const wasmHelperCode = `
|
||||||
|
import { join } from 'path'
|
||||||
|
import { readFile } from 'fs/promises'
|
||||||
|
|
||||||
|
export default async function loadWasm(file, importObject = {}) {
|
||||||
|
const wasmBuffer = await readFile(join(__dirname, file))
|
||||||
|
const result = await WebAssembly.instantiate(wasmBuffer, importObject)
|
||||||
|
return result.instance
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
export default function assetPlugin(): Plugin {
|
export default function assetPlugin(): Plugin {
|
||||||
let sourcemap: boolean | 'inline' | 'hidden' = false
|
let sourcemap: boolean | 'inline' | 'hidden' = false
|
||||||
let publicDir = ''
|
let publicDir = ''
|
||||||
|
@ -52,7 +73,16 @@ export default function assetPlugin(): Plugin {
|
||||||
publicDir = normalizePath(config.publicDir)
|
publicDir = normalizePath(config.publicDir)
|
||||||
outDir = normalizePath(config.build.outDir)
|
outDir = normalizePath(config.build.outDir)
|
||||||
},
|
},
|
||||||
|
resolveId(id): string | void {
|
||||||
|
if (id === wasmHelperId) {
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
},
|
||||||
async load(id): Promise<string | void> {
|
async load(id): Promise<string | void> {
|
||||||
|
if (id === wasmHelperId) {
|
||||||
|
return wasmHelperCode
|
||||||
|
}
|
||||||
|
|
||||||
const assetResolved = resolveAsset(id)
|
const assetResolved = resolveAsset(id)
|
||||||
if (!assetResolved) {
|
if (!assetResolved) {
|
||||||
return
|
return
|
||||||
|
@ -97,6 +127,12 @@ export default function assetPlugin(): Plugin {
|
||||||
if (assetResolved.type === 'native') {
|
if (assetResolved.type === 'native') {
|
||||||
return `export default require(${referenceId})`
|
return `export default require(${referenceId})`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (assetResolved.type === 'wasm') {
|
||||||
|
return `
|
||||||
|
import loadWasm from ${JSON.stringify(wasmHelperId)}
|
||||||
|
export default importObject => loadWasm(${referenceId}, importObject)`
|
||||||
|
}
|
||||||
},
|
},
|
||||||
renderChunk(code, chunk): { code: string; map: SourceMapInput } | null {
|
renderChunk(code, chunk): { code: string; map: SourceMapInput } | null {
|
||||||
let match: RegExpExecArray | null
|
let match: RegExpExecArray | null
|
||||||
|
|
Loading…
Reference in a new issue