Tidak dapat menemukan modul shelljs saat menyertakan lib dalam skrip ketikan sudut 2

Saya ingin memasukkan perpustakaan Shelljs ke skrip ketikan 2 sudut. Saya telah memasukkan file shelljs.d.ts ke perpustakaan node_modules/shelljs saya.

Paket saya.json

"name": "myproj1",
  "description": "myproj1: A project",
  "typings": {
    "shelljs": {
      "definitions": "node_modules/shelljs/shelljs.d.ts",
      "source": "node_modules/shelljs/global.js"
    }
  },

Webpack.config.js saya

var path = require('path');
module.exports = {
    entry:  './app/web/boot.ts',
    output: {
        path: path.resolve(__dirname, "js"),
        filename: "bundle.js"
    },
    resolve: {
        extensions:['','.js','.ts']
    },
    module:{
        loaders: [{
            test: /\.ts/,
            loaders: ['ts-loader'],
            exclude: /node_modules/
        }]
    },
    target: 'node'
};

Opsi kompiler package.json saya:

"compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },

File TS saya:

import child = require("shelljs");
somefun(){
 child.exec('node --version',(code, stdout, stderr)=>{
            console.log('Exit code:', code);
            console.log('Program output:', stdout);
            console.log('Program stderr:', stderr);
        });
}

Saya mendapatkan pesan kesalahan "Tidak dapat menemukan modul 'shelljs'". Tolong bantu saya untuk memasukkan perpustakaan dalam proyek saya.


person AishApp    schedule 28.04.2016    source sumber
comment
tidak tahu cara shell.js bekerja tetapi coba let shell = require('shelljs/global'); shell.exec(...   -  person tchelidze    schedule 28.04.2016


Jawaban (1)


Gunakan tsd untuk mengelola semua pengetikan Anda.

Dari direktori proyek Anda:

npm install tsd -g
tsd install node --save
tsd install shelljs --save

Kemudian sertakan referensi ke Shelljs di foo.ts Anda:

/// <reference path="typings/shelljs/shelljs.d.ts" />
import {exec} from "shelljs";

exec('node --version', code => {
    console.log('Exit code:', code);
});

Berdasarkan komentar, berikut ringkasannya:

Penggunaan shelljs hanya dapat dilakukan di lingkungan NodeJS. Ini bisa berupa instance nodejs mentah, atau beberapa proyek yang berisi nodejs sendiri, seperti Electron.

Anda juga harus memperhatikan, Sistem Modul mana yang Anda gunakan. Untuk NodeJS Anda dapat menggunakan CommonJS tanpa bundler lebih lanjut. Namun jika Anda mengkompilasi TypeScript untuk frontend, dimana NodeJS tidak ada, maka Anda juga harus menggabungkan modul CommonJS Anda dengan browserify . Atau Anda dapat menggunakan Modul jenis lain, seperti amd atau SystemJS, lalu dalam opsi kompiler skrip, Anda menyetel `"module": "system" misalnya. Lihat semua opsi di sini

person tenbits    schedule 29.04.2016
comment
tsd telah diperbarui untuk mengetik dan ketika saya memasukkannya, saya mendapatkan kesalahan karena modul selalu mencari di bawah folder node_modules. Jadi saya menginstal shelljs npm dan menempatkan file pengetikan saya di dalam folder node_modules/shelljs. Saya masih mendapatkan kesalahan karena tidak dapat menemukan modul shelljs. Node.d.ts tersedia di bawah sudut2 ts secara default. - person AishApp; 02.05.2016
comment
Anda tidak boleh menempatkan apa pun di dalam node_modules. Instal pengetikan dengan tsd untuk shelljs dan sertakan jalur yang benar di file Anda dengan /// <reference path="shelljs/shelljs.d.ts" />. Perhatikan bahwa jalurnya relatif terhadap file .ts Anda saat ini. - person tenbits; 02.05.2016
comment
Tanpa menginstal shelljs di node_modules, saya mendapatkan kesalahan sebagai berikut saat kompilasi.c:\Users\user\Desktop\Samples\Angular_Projects\myProject1\myproj1\node_modules\shelljs tidak ada (modul sebagai direktori) Dengan shelljs di node_modules diinstal, saya mendapatkan Kesalahan Referensi Tidak Tertangkap: persyaratan tidak ditentukan selama waktu berjalan dengan layar kosong ditampilkan di aplikasi saya - person AishApp; 02.05.2016
comment
Ya, Anda harus menginstal npm install shelljs --save, tetapi Anda tidak boleh memodifikasinya, karena Anda menulis file pengetikan saya ditempatkan di dalam folder node_modules/shelljs. Pengetikannya dipasang terpisah untuk modul ini: tsd install shelljs --save. Jadi masalah dengan ReferenceError: sebenarnya itu berarti skrip ketikan berhasil dikompilasi dan dijalankan, tetapi tampilan web tidak mengenali metode require. Apakah Anda menggunakan Electron? Seperti yang kemudian dikabelkan, karena elektron mendukung nodejs require. - person tenbits; 02.05.2016
comment
TIDAK. saya tidak menggunakan elektron. Saya kira masalahnya adalah karena penggunaan webpack. Tapi saya tidak tahu bagaimana mengatasinya. Dari contoh, saya mencoba memasukkan target: 'node', node: { global: 'window', crypto: 'empty', process: true, module: false, clearImmediate: false, setImmediate: false } di config. Namun masalahnya tetap sama - person AishApp; 02.05.2016
comment
Di mana aplikasi Anda berjalan? Di peramban? Maka Anda tidak dapat menggunakan shelljs di sana, karena tidak mengizinkan untuk menjalankan perintah shell sistem. - person tenbits; 02.05.2016
comment
Apa skenario Anda? Anda ingin beberapa pengguna menavigasi ke halaman web Anda dan kemudian Anda ingin menjalankan beberapa perintah shell di mesinnya? Maka itu tidak mungkin sama sekali. Bayangkan semua masalah keamanan yang dialami orang-orang). Perintah apa yang ingin Anda jalankan? Anda dapat menggunakan electron misalnya. Ini adalah browser mandiri dengan nodejs di dalamnya. Ini berperilaku seperti aplikasi sistem normal. Orang-orang kemudian mengunduh aplikasi Anda, menginstalnya dan menjalankannya seperti aplikasi biasa. Jadi di sana, di luar mesin render browser, Anda juga dapat menggunakan nodejs. - person tenbits; 02.05.2016
comment
Skenario saya: ketika pengguna mengklik tombol di browser, saya harus menavigasi ke server saya, di mana saya harus menjalankan perintah shell untuk membuat, membangun dan menjalankan file dan kemudian memberikan file akhir kembali ke pengguna untuk diunduh. Saya mencoba menggunakan node child_process tetapi sekali lagi kembali ke apa yang telah Anda jelaskan sebelumnya. Adakah cara untuk mencapai hal ini? - person AishApp; 02.05.2016
comment
Ya, Anda harus menyediakan API untuk ini menggunakan beberapa server NodeJS. Ini tidak ada hubungannya dengan sudut. Pengguna mengklik tombol tersebut, dan Anda kemudian mengirimkan permintaan ajax ke api tersebut, dan titik akhir melakukan semua pekerjaan dan mengirimkan kembali responsnya. Jadi, Anda harus melihat ke arah expressjs. Jadi aplikasi Anda akan terdiri dari 2 bagian - frontend (angularjs, browser), dan backend - RESTful endpoint dengan NodeJS. - person tenbits; 02.05.2016
comment
Terima kasih banyak. Saya akan memeriksa dengan expressjs. Sekali lagi terima kasih atas waktu Anda yang berharga - person AishApp; 02.05.2016
comment
Sama-sama, jika Anda memiliki pertanyaan lebih lanjut, silakan mengisi untuk membuat pertanyaan apa pun. - person tenbits; 02.05.2016