如何根据我的YML构建文件在Javascript中需要不同的模块?

时间:2016-10-03 16:31:20

标签: javascript build electron

我目前正在开发一款网页游戏,它也可以通过electron作为桌面应用程序使用。如果我正在构建游戏的网络版,我不想require('electron')

我与build一起使用的.yml文件如下:

cmd: browserify {PROJECT_PATH}/js/main.js > {PROJECT_PATH}/js/bundle.js && {PROJECT_PATH}/index.html
name: 'web'
targets:
  electron:
    cmd: browserify {PROJECT_PATH}/js/main.js > {PROJECT_PATH}/js/bundle.js && electron {PROJECT_PATH}

如果我的构建命令类似于node main.js true,我可以引用布尔参数,然后在Javascript中使用它来require('electron')。但是,鉴于目前的情况,我不确定如何做到这一点。

换句话说,我想通过我的.yml构建文件传递一个布尔参数,并使用所谓的布尔值,如下所示:

if (passedBoolean) {
  const {app, BrowserWindow} = require('electron');
}

我该怎么做?如果不可能,那么另一种解决方案是什么?

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题。第一种是向平台查询其功能。例如,Electron设置变量:

process.versions.electron

如果您在浏览器中运行,则不会设置此项,因此您可以检查其存在(并且您将知道您正在使用Electron运行)。这是文档:Electron: Process

测试嵌套属性可能有点粗略,所以稍微简单一点的方法是尝试访问try / catch中的值:

try {
    process.versions.electron; 
} catch (err) {
    console.log('Not electron', err);
}

你甚至可以把它包装成一个很好的功能:

function isPlatformElectron() {
    'use strict';
    try {
        process.versions.electron;
        return true;
    } catch (err) {
        return false;
    }
}

if (isPlatformElectron()) {
    // Do Electron-specific stuff here
}

您也可以使用原始代码执行此类操作(稍加修改):

let app, BrowserWindow;
try {
    ({app, BrowserWindow} = require('electron'));
} catch (err) {
    console.log('Not electron');
}

if (app && BrowserWindow) {
   console.log('is electron');
}

我发现这个版本更难以阅读并且更喜欢我上面提到的函数方法,但我认为使用像你原来的解构一样展示这个例子可能很有用(尽管在这种情况下你不能使用const)。

相关问题