web-dev-qa-db-ja.com

TypeScript、SystemJS、Electronでnodejs "child_process"が必要

私は単純なnodejs electron (以前はatom Shell)と呼ばれていました)プロジェクトに取り組んでいます。angular 2、プロジェクトを使用して、TypeScriptのドキュメントで推奨されているのと同じプロジェクト設定を使用します。

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ファイルからそのタイプを使用しているときに、「インポート」または「要求」する方法を見つけることができませんでした。 node.d.tsファイルに「child_process」インターフェースが見つかりました。これは私のニーズに合っています。これは、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

今のところ、私は次のようにして自分の道を歩んでいます

var child_process = require('child_process');

しかし、とにかくこの変数にタイプ情報を追加することができませんでした:

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

タイプ情報を使用して、child_process(または、「:」演算子の後に指定できるパブリックインターフェイスを持たない、宣言されたその他のノードモジュール)を取得する方法に関するアイデアはありますか?

どんな助けと説明でも前もってたくさんありがとう:)

更新------------------------------------------------- -----------------

Tenbitsが示唆したように、ファイルの先頭に次のように参照を追加しました:///

そして、あなたが言ったインポートステートメントを使用しましたが、私のモジュールローダーを変更しませんでした。それでも期待どおりのエラーは発生しませんでした。私のプロジェクトではangular 2を使用しているため、モジュールシステムの変更にあまり慣れていません。そのドキュメントと一部のガイドは、以前はこの問題を好まなかった新しいプロジェクト(モジュールローダーシーンの新機能で、まだどのように動作するのか完全に理解していません。変更しようとすると、angular 2に関するエラーが発生しました。モジュールローダーを変更せずにこれを行う方法はありませんか?最初にcommonjsモジュールをサポートしていると言っているsystemjsサイトをちらっと見ると、次のようになります。 Systemjs doc

私はモジュールシステムを変更しないソリューション、またはおそらく何が起こっているのか、そこに存在するこれらの種類のモジュールロード問題へのアプローチについてのより深い説明を解決するソリューションを具体化します

10
Ziv Glazer

さて、いくつかの調査の後 #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'
  }
});

それだけです!

24
tenbits

私にとっては、結果を表示するためにコールバックで動作しました。

import * as child from 'child_process';

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

ノードアプリケーションにそのような構成がないため、SystemJSにマッピングを追加しませんでした

2
rinoy