NW.js child_process не работает с приложением vue.js

Я хочу создать приложение vue.js с помощью узла webkit (Nw.js).

Приложение должно выполнять двоичный файл, поэтому я сделал

const exec = require("child_process").exec;
  exec(
    '"C:\\someBin.exe" /someOptions',
    (e, stdout, stderr) => {
      if (e instanceof Error) {
        console.error(e);
        throw e;
      }
      console.log("stdout ", stdout);
      console.log("stderr ", stderr);
    }
  );

Я пробовал с .exec или .spawn, но всегда получаю странные ошибки, например:

TypeError: (0 , n(...).exec) is not a function

Он должен быть связан со мной с помощью vue.js, потому что, когда я тестирую этот код в простом приложении node webkit только с тегом script, он работает!

Есть ли какая-то несовместимость между веб-пакетом (используемым vue.js) и ключевым словом require в nodejs?

При печати содержимого require("child_process") есть несколько вещей, но ничего из того, что я ожидал (нет методов spawn или exec). Кажется, что само требование не работает для этого конкретного случая. Но, как ни странно, он все еще работает для других установленных пакетов npm.

Для создания приложения я использую "npm run build", который создает окончательные файлы непосредственно в каталоге /dist. В этом каталоге я поместил файлы node webkit, поэтому я могу просто запустить оттуда двоичный файл node webkit.


person Doctor    schedule 06.05.2018    source источник
comment
Вы пытаетесь использовать exec на стороне клиента? Вы не можете выполнить двоичный файл из браузера. Вы также не можете использовать child_proccess без node core, так как он должен выполняться только на стороне сервера.   -  person Ohgodwhy    schedule 06.05.2018
comment
@Ohgodwhy Спасибо за ответ. Как я уже сказал, я использую NW.js, а не обычный браузер. В этом случае я не думаю, что есть клиентская или серверная сторона. Приведенный выше код работает в простом приложении nw.js (без фреймворков и прочего).   -  person Doctor    schedule 07.05.2018


Ответы (1)


Наконец я нашел решение.

Похоже, что webpack перезаписывает некоторые модули узлов.

Чтобы предотвратить это, вам просто нужно добавить это в конфигурацию вашего веб-пакета:

target: 'node-webkit',

Я читал, что были и другие типы доступных целей, например «узел».

Это большая часть файла веб-пакета, который поможет вам правильно разместить приведенную выше строку.

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
     publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      ...(config.dev.useEslint ? [createLintingRule()] : []),
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test'), 
resolve('node_modules/webpack-dev-server/client')]
       },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
  target: 'node-webkit'
}
person Doctor    schedule 10.05.2018