场景形容
-- 2020-04-28
更新:因为 flash 30
版本当前会呈现提醒“未能正确加载必要组件”(其实是广告程序),导致生效,flash
版本应该替换为 29
版本。--
electron 援用 flash 插件打包示例
上一篇 electron
踩坑(一) 说到 electron
加载 flash
的问题
采纳的是加载零碎装置好的 flash
插件,须要用户提前装置好 flash
能力失常工作
app.commandLine.appendSwitch('ppapi-flash-path', app.getPath('pepperFlashSystemPlugin'));
其中 app.getPath('pepperFlashSystemPlugin')
会主动找寻零碎 flash
的所在门路
然而,如果用户没装 flash
就关上利用,就会提醒报错,带来不好的用户体验
所以,咱们须要将 flash
嵌入利用依赖,也就是插件跟着利用打包
win
上面的软件有 32
位和 64
位的说法,而且装置地位会有不同。那么 flash
也不例外
C:\Windows\System32\Macromed\Flash\pepflashplayer64_29_0_0_238.dllC:\Windows\SysWOW64\Macromed\Flash\pepflashplayer32_29_0_0_238.dll
当然,下面版本号会变动,然而 dll
所在门路根本是如上所示
找到 flash
所在门路后,咱们就能够提取文件放到咱们的利用目录下了
编译后就会成为利用安装包的一部分,这样就不须要用户手动装置 flash
了
???? 那么,在 electron
目录下应该如何引入呢?
问题解决
将 flash
插件目录放到根目录的 lib
文件夹下
/lib/pepflashplayer64_29_0_0_238.dll/lib/pepflashplayer32_29_0_0_238.dll
接下来须要在主程序入口文件 /src/main/index.js
下进行引入
也就是将这一句获取零碎 flash
插件门路的代码
app.commandLine.appendSwitch('ppapi-flash-path', app.getPath('pepperFlashSystemPlugin'));
换为
let flashPlugins = process.arch == 'x64' ? require('path').resolve(__dirname, '../../lib/pepflashplayer64_29_0_0_238.dll') : require('path').resolve(__dirname, '../../lib/pepflashplayer32_29_0_0_238.dll')app.commandLine.appendSwitch('ppapi-flash-path', flashPlugins);
如果应用的是 BrowserWindow
:
const mainWindow = new BrowserWindow({ height: 900, width: 1600, useContentSize: true, frame: false, center: true, fullscreenable: false, // 是否容许全屏 center: true, // 是否呈现在屏幕居中的地位 title: 'Electron利用', backgroundColor: '#fff', // 背景色,用于transparent和frameless窗口 titleBarStyle: 'hidden', // 标题栏的款式,有hidden、hiddenInset、customButtonsOnHover等 resizable: false, // 是否容许拉伸大小 webPreferences: { //配置web参数选项 plugins: true, //开启插件 webSecurity: false, //平安 defaultFontFamily: { //字体相干 standard: "Microsoft YaHei", defaultEncoding: "utf-8" } }})
其中,plugins: true
是必须要配置的,这是通知 electron
须要应用插件
而后就是打包配置 package.json
,在 build
项配置上面内容
"build": { …… …… "win": { "icon": "build/icons/icon.ico", "extraResources": "./lib/*.dll" //将特定的文件排除,不打包在asar包内 }, …… ……}
还有一个问题比拟困扰的是,在第一次进行利用打包时,打包须要的三个包文件下载速度极慢,导致体验很差,须要再进行镜像配置。
"build": { "electronDownload": { "mirror": "https://npm.taobao.org/mirrors/electron/" },}
至此,开发模式和生产模式下都是能够胜利运行的
以下是 /src/main/index.js
残缺代码
import { app, BrowserWindow } from 'electron'import express from 'express'if (process.env.NODE_ENV !== 'development') { global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')}//打包后的文件默认是以 "file://" 协定加载的//因为 flash 不容许在 "file://" 协定下加载,为了解决 flash 加载的平安问题//应用 express 用作本地服务器,使得页面运行在本地 http 端口服务function localServer() { let server = express(); server.use(express.static(__dirname)); server.listen(9080);}if (process.env.NODE_ENV === "production") { localServer();}let mainWindowconst winURL = process.env.NODE_ENV === 'development' // webpack 配置的 dev 服务端口 ? `http://localhost:9080` // : `file://${__dirname}/index.html` // 解决 flash 不容许在 "file://" 协定下加载的问题 : `http://localhost:9080/index.html`let flashPlugins = process.arch == 'x64' ? require('path').resolve(__dirname, '../../lib/pepflashplayer64_29_0_0_238.dll') : require('path').resolve(__dirname, '../../lib/pepflashplayer32_29_0_0_238.dll')if (__dirname.includes(".asar")) { flashPlugins = process.arch == 'x64' ? require('path').join(process.resourcesPath + '/lib/pepflashplayer64_29_0_0_238.dll') : require('path').join(process.resourcesPath + '/lib/pepflashplayer32_29_0_0_238.dll')}app.commandLine.appendSwitch('ppapi-flash-path', flashPlugins);app.commandLine.appendSwitch('ppapi-flash-version', '29.0.0.238');function createWindow () { /** * Initial window options */ mainWindow = new BrowserWindow({ height: 900, width: 1600, useContentSize: true, frame: false, center: true, fullscreenable: false, // 是否容许全屏 center: true, // 是否呈现在屏幕居中的地位 title: 'Electron利用', backgroundColor: '#fff', // 背景色,用于transparent和frameless窗口 titleBarStyle: 'hidden', // 标题栏的款式,有hidden、hiddenInset、customButtonsOnHover等 resizable: false, // 是否容许拉伸大小 webPreferences: { plugins: true, webSecurity: false, defaultFontFamily: { standard: "Microsoft YaHei", defaultEncoding: "utf-8" } } }) if (process.env.NODE_ENV == 'development') { mainWindow.webContents.openDevTools() } mainWindow.loadURL(winURL) mainWindow.on('closed', () => { mainWindow = null })}app.on('ready', createWindow)app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() }})app.on('activate', () => { if (mainWindow === null) { createWindow() }})
End