2016-04-11 2 views
6

Я работаю над простым узлом nodejs electron (ранее называемым атомарным корпусом). Я пишу его с помощью угловой 2, с помощью проекта же настройки проекта, как они рекомендуют в документации по машинописи:Требовать nodejs "child_process" с помощью TypeScript, SystemJS и Electron

TSC:

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false 
    }, 
    "exclude": [ 
    "node_modules", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

Мне нужно выполнить команду, я обнаружил, что Я могу сделать это с помощью узла «child_process». В любом случае, я не смог найти «импортировать» или «потребовать» его, указав его тип, используемый в файле node.d.ts. Я нашел интерфейс «child_process» в файле node.d.ts, который подходит моя потребность, это, как она смотрит в файле node.d.ts:

declare module "child_process" { 
    import * as events from "events"; 
    import * as stream from "stream"; 

    export interface ChildProcess extends events.EventEmitter { 
     stdin: stream.Writable; 
     stdout: stream.Readable; 
     stderr: stream.Readable; 
     pid: number; 
     kill(signal?: string): void; 
     send(message: any, sendHandle?: any): void; 
     disconnect(): void; 
     unref(): void; 
    } 

    export function spawn(command: string, args?: string[], options?: { 
     cwd?: string; 
     stdio?: any; 
     custom?: any; 
     env?: any; 
     detached?: boolean; 
    }): ChildProcess; 
    export function exec(command: string, options: { 
     cwd?: string; 
     stdio?: any; 
     customFds?: any; 
     env?: any; 
     encoding?: string; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
    }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function exec(command: string, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, 
     callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, args?: string[], 
     callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, args?: string[], options?: { 
     cwd?: string; 
     stdio?: any; 
     customFds?: any; 
     env?: any; 
     encoding?: string; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
    }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function fork(modulePath: string, args?: string[], options?: { 
     cwd?: string; 
     env?: any; 
     execPath?: string; 
     execArgv?: string[]; 
     silent?: boolean; 
     uid?: number; 
     gid?: number; 
    }): ChildProcess; 
    export function spawnSync(command: string, args?: string[], options?: { 
     cwd?: string; 
     input?: string | Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): { 
     pid: number; 
     output: string[]; 
     stdout: string | Buffer; 
     stderr: string | Buffer; 
     status: number; 
     signal: string; 
     error: Error; 
    }; 
    export function execSync(command: string, options?: { 
     cwd?: string; 
     input?: string|Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): string | Buffer; 
    export function execFileSync(command: string, args?: string[], options?: { 
     cwd?: string; 
     input?: string|Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): string | Buffer; 
} 

, но я только могу (как я знаю) получить этот тип только с помощью импорта:

import * as child_process from 'child_process'; 

только проблема в том, что, когда я делаю это, мое приложение нагрузки косяк, и я получаю следующее сообщение об ошибке в консоли:

GET file:///C:/angular2Samples/NGW-electron-VS%20-%20TEMP/child_process net::ERR_FILE_NOT_FOUND 

Сейчас , я получаю мой wa у вокруг с помощью:

var child_process = require('child_process'); 

, но я не мог найти в любом случае, чтобы добавить информацию о типе этой вар:

var child_process : I_CANT_PUT_ANY_CHILD_PROCESS_TYPE_HERE = require('child_process'); 

Любые идеи о том, как я могу получить child_process (или любой другой узел объявлен модули, которые представляют собой открытый интерфейс, который я могу указать после оператора «:») с информацией о типе?

Большое спасибо заранее за любую помощь и объяснения :)

UPDATE ------------------------------ ------------------------------------

В качестве предлагаемого десятилетия я добавил ссылку следующим образом в верхней части файла: ///

и использовал статут импорта, который вы сказали, но не использовал мой модуль-загрузчик. он все еще не работал с той же ошибкой, что и ожидалось. Я не чувствую себя очень комфортно в отношении изменения модульной системы, так как мой проект использует угловые 2 и их документы, а некоторые из их гидов сказали, что новые проекты, у которых нет прежних предпочтений по этому вопросу (я очень новичок в области загрузчиков модулей и им не полностью понимая, как это работает). Когда я попытался изменить его, у меня появились некоторые ошибки в отношении угловых 2 вещей, на которые у меня нет времени, чтобы попасть в данный момент. Разве не может быть этого, не меняя загрузчик модуля?взглянув на systemjs месте он говорит в самом начале, что он поддерживает CommonJS модули: Systemjs doc

Я действительно appriciate решение, которое не изменяет систему модуля, или, может быть, больше глубины explanition о том, что происходит и какие подходы к такого рода проблем загрузки модуля существует там

ответ

12

Хорошо, после того, как некоторые исследования #L138 Я нашел решение

Вы можете использовать import как раньше

import * as child from 'child_process'; 

var foo: child.ChildProcess = child.exec('foo.sh'); 
console.log(typeof foo.on); 

Но вы должны сконфигурировать SystemJS, чтобы отобразить модуль в NodeJS.

System.config({ 
    map: { 
    'child_process': '@node/child_process' 
    } 
}); 

Это все!

+0

Большое спасибо за Ваш комментарий! Я пробовал это, пожалуйста, посмотрите мое обновление к заданию относительно вашего ответа :) –

+0

Я не совсем понял: вы пробовали «import child = require ('child_process');' вместо 'var child = require ('child_process'); '? У вас есть тот же результат, что и с 'var'? – tenbits

+0

Да, точно так же (обратите внимание, что я не изменил модуль на commonjs, как вы сказали, причина этого указана в моем обновлении выше) –

0

Для меня это работало с обратным вызовом, чтобы отобразить результаты.

import * as child from 'child_process'; 

var foo: child.ChildProcess = child.exec('dir', (error: string, stdout: string, stderr: string) => { 
      console.log(stdout);  
     }); 

Я не добавлял никаких сопоставлений в SystemJS как я не имею любую такую ​​конфигурацию в приложении узла