文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
设置模块别名与解析钩子
虽然可以在开发者调试工具中使用 Node.js 和 Electron 的内置模块,但现在还不能在 Vue 的页面内使用这些模块。
因为 Vite 主动屏蔽了这些内置的模块,如果开发者强行引入它们,那么大概率会得到如下报错:
Module "xxxx" has been externalized for browser compatibility and cannot be accessed in client code.
安装 vite-plugin-optimizer:
npm i vite-plugin-optimizer -D
修改 vite.config.ts 的代码,让 Vite 加载这个插件:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { devPlugin, getReplacer } from './plugins/devPlugin';
import optimizer from 'vite-plugin-optimizer';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [optimizer(getReplacer()), devPlugin(), vue()],
})
vite-plugin-optimizer 插件会创建一个临时目录:node_modules.vite-plugin-optimizer。
然后把类似 const fs = require('fs'); export { fs as default } 这样的代码写入这个目录下的 fs.js 文件中。
渲染进程执行到:import fs from "fs" 时,就会请求这个目录下的 fs.js 文件,这样就达到了在渲染进程中引入 Node 内置模块的目的。
getReplacer 方法是为 vite-plugin-optimizer 插件提供的内置模块列表:
export let getReplacer = () => {
let externalModels = ['os', 'fs', 'path', 'events', 'child_process', 'crypto', 'http', 'buffer', 'url', 'better-sqlite3', 'knex'];
let result = {};
for (let item of externalModels) {
result[item] = () => ({
find: new RegExp(`^${item}$`),
code: `const ${item} = require('${item}'); export { ${item} as default }`,
});
}
result['electron'] = () => {
let electronModules = ['clipboard', 'ipcRenderer', 'nativeImage', 'shell', 'webFrame'].join(',');
return {
find: new RegExp(`^electron$`),
code: `const {${electronModules}} = require('electron'); export { ${electronModules} }`,
}
}
return result;
}
在这个方法中把一些常用的 Node 模块和 electron 的内置模块提供给了 vite-plugin-optimizer 插件,以后想要增加新的内置模块只要修改这个方法即可。
vite-plugin-optimizer 插件不仅用于开发环境,编译 Vue 项目时,它也会参与工作。
通过如下代码在 Vue 组件中做测试:
// src\App.vue
import fs from "fs";
import { ipcRenderer } from "electron";
import { onMounted } from "vue";
onMounted(() => {
console.log(fs.writeFileSync);
console.log(ipcRenderer);
});
开发者调试工具将会输出如下内容:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论