electron-vite-vue/vite.config.electron.ts

103 lines
3.0 KiB
TypeScript
Raw Normal View History

2022-06-25 08:46:01 +08:00
import { join } from 'path'
2022-06-25 10:47:12 +08:00
import { builtinModules } from 'module'
2022-06-25 08:46:01 +08:00
import { defineConfig } from 'vite-plugin-electron'
2022-06-25 10:47:53 +08:00
import resolve, { lib2esm } from 'vite-plugin-resolve'
2022-06-25 10:47:12 +08:00
import pkg from './package.json'
// @ts-ignore
const dependencies = Object.keys(pkg.dependencies || {})
2022-06-25 10:47:12 +08:00
const external = [
'electron',
...builtinModules,
// (🎯-①): For use Node.js package in Electron-Main, Preload-Script
...dependencies,
2022-06-25 10:47:12 +08:00
]
2022-06-25 08:46:01 +08:00
export default defineConfig({
main: {
entry: 'electron/main/index.ts',
vite: {
build: {
sourcemap: false,
outDir: 'dist/electron/main',
2022-06-25 10:47:12 +08:00
rollupOptions: {
external,
},
2022-06-25 08:46:01 +08:00
},
},
},
preload: {
input: {
// You can configure multiple preload here
splash: join(__dirname, 'electron/preload/splash.ts'),
},
vite: {
build: {
// For debug
sourcemap: 'inline',
outDir: 'dist/electron/preload',
2022-06-25 10:47:12 +08:00
rollupOptions: {
external,
},
2022-06-25 08:46:01 +08:00
}
}
},
})
2022-06-25 10:47:53 +08:00
/**
* ## Why?
*
* Many times, many people want to use the Node.js package in Electron-Renderer, but it may not work correctly in Vite by default.
* Electron-Renderer 使 Node.js Vite
*
* e.g.
* Let's use `serialport` as an example.
* 使 `serialport` 🌰
*
* ```js
* // ❌ May not work correctly in Vite by default.
* import serialport, { SerialPort, SerialPortMock } from 'serialport';
* ```
*
* At this time, we need to use `vite-plugin-resolve` to convert `serialport` to ensure that it works normally.
* 使 `vite-plugin-resolve` `serialport`
*
* e.g.
*
* ```js
* // serialport
* const _M_ = require('serialport');
* const _D_ = _M_.default || _M_;
* export { _D_ as default };
* export const SerialPort = _M_.SerialPort;
* export const SerialPortMock = _M_.SerialPortMock;
* ```
*
* Try to use again.
*
* ```js
* // ✅ This looks like nothing has changed, but it works normally after the `vite-plugin-resolve` converted.
* import serialport, { SerialPort, SerialPortMock } from 'serialport';
* ```
*
* 🚧 It should be noted that the Node.js package, as a dependency of the project, should be placed in `dependencies`; Unless you konw how to build them with Vite.
* Node.js `dependencies` 使 Vite
*/
2022-06-25 10:47:53 +08:00
export function useNodeJsInElectronRenderer() {
const entries = dependencies.reduce((memo, moduleId) => {
const members = Object.keys(require(moduleId))
const snippet_of_cjs2esm = lib2esm(
// CJS lib name
moduleId,
// export memebers
members,
{ format: 'cjs' },
)
return Object.assign(memo, { [moduleId]: snippet_of_cjs2esm })
}, {} as Parameters<typeof resolve>[0])
2022-06-25 10:47:53 +08:00
// (🎯-②): For use Node.js package in Electron-Renderer
return resolve(entries)
2022-06-25 10:47:53 +08:00
}