ไม่พบโมดูล shelljs บนการรวม lib ใน typescript เชิงมุม 2

ฉันต้องการรวมไลบรารี่ของเชลล์ js เข้ากับ typescript เชิงมุม 2 ฉันได้รวมไฟล์ shelljs.d.ts ไว้ในไลบรารี node_modules/shelljs ของฉันแล้ว

package.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 ของฉัน

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'
};

ตัวเลือกคอมไพเลอร์ package.json ของฉัน:

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

ไฟล์ TS ของฉัน:

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);
        });
}

ฉันได้รับข้อผิดพลาด "ไม่พบโมดูล 'shelljs'" โปรดช่วยฉันรวมห้องสมุดไว้ในโครงการของฉัน


person AishApp    schedule 28.04.2016    source แหล่งที่มา
comment
ไม่รู้ว่า shell.js ทำงานอย่างไร แต่ลอง let shell = require('shelljs/global'); shell.exec(...   -  person tchelidze    schedule 28.04.2016


คำตอบ (1)


ใช้ tsd เพื่อจัดการการพิมพ์ทั้งหมดของคุณ

จากไดเรกทอรีโครงการของคุณ:

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

จากนั้นรวมการอ้างอิงถึง shelljs ใน foo.ts ของคุณ:

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

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

จากความคิดเห็น นี่คือบทสรุป:

การใช้ shelljs สามารถทำได้ในสภาพแวดล้อม NodeJS เท่านั้น นี่อาจเป็นอินสแตนซ์ nodejs แบบ raw หรือบางโครงการที่มี nodejs ในตัวเอง เช่น Electron

นอกจากนี้คุณควรใส่ใจด้วยว่าคุณกำลังใช้ระบบโมดูลใดอยู่ สำหรับ NodeJS คุณสามารถใช้ CommonJS โดยไม่ต้องมีบันเดิลเพิ่มเติม แต่ถ้าคุณคอมไพล์ TypeScripts ของคุณสำหรับส่วนหน้า โดยที่ NodeJS ไม่ปรากฏ คุณควรรวมโมดูล CommonJS ของคุณเข้ากับ browserify . หรือคุณสามารถใช้โมดูลประเภทอื่นได้ เช่น amd หรือ SystemJS จากนั้นในตัวเลือกคอมไพเลอร์ typescript คุณตั้งค่า `"module": "system" เป็นต้น ดูตัวเลือกทั้งหมดที่นี่

person tenbits    schedule 29.04.2016
comment
tsd ได้รับการอัปเดตเป็นการพิมพ์ และเมื่อฉันรวมมันไว้ ฉันได้รับข้อผิดพลาดเนื่องจากโมดูลจะดูอยู่ใต้โฟลเดอร์ node_modules เสมอ ดังนั้นฉันจึงติดตั้ง shelljs npm และวางไฟล์การพิมพ์ของฉันไว้ในโฟลเดอร์ node_modules/shelljs ฉันยังคงได้รับข้อผิดพลาดเนื่องจากไม่พบโมดูล shelljs Node.d.ts พร้อมใช้งานภายใต้ angular2 ts โดยค่าเริ่มต้น - person AishApp; 02.05.2016
comment
คุณไม่ควรวางสิ่งใดไว้ภายใน node_modules ติดตั้งการพิมพ์ด้วย tsd สำหรับ shelljs และรวมเส้นทางที่ถูกต้องในไฟล์ของคุณด้วย /// <reference path="shelljs/shelljs.d.ts" /> โปรดทราบว่าเส้นทางนั้นสัมพันธ์กับไฟล์ .ts ปัจจุบันของคุณ - person tenbits; 02.05.2016
comment
โดยไม่ต้องติดตั้ง shelljs ใน node_modules ฉันได้รับข้อผิดพลาดดังนี้ใน compiling.c:\Users\user\Desktop\Samples\Angular_Projects\myProject1\myproj1\node_modules\shelljs ไม่มีอยู่ (โมดูลเป็นไดเรกทอรี) เมื่อติดตั้ง shelljs ใน node_modules ฉันได้รับ Uncaught ReferenceError: need is not specified ในระหว่างรันไทม์โดยมีหน้าจอว่างปรากฏบนแอปของฉัน - person AishApp; 02.05.2016
comment
ใช่ คุณต้องติดตั้ง npm install shelljs --save แต่คุณไม่ควรแก้ไขมัน เนื่องจากคุณเขียนว่าวางไฟล์การพิมพ์ของฉันไว้ในโฟลเดอร์ node_modules/shelljs การพิมพ์ได้รับการติดตั้งแยกต่างหากสำหรับโมดูลนี้: tsd install shelljs --save ดังนั้นปัญหาของ ReferenceError: จริงๆ แล้วหมายความว่าการคอมไพล์ typescript สำเร็จแล้วและทำงานได้ แต่ webview ไม่รู้จักเมธอด require คุณใช้ Electron หรือไม่? เนื่องจากมีการเชื่อมต่อแบบสาย เนื่องจากอิเล็กตรอนรองรับ nodejs require - person tenbits; 02.05.2016
comment
เลขที่. ฉันไม่ได้ใช้อิเล็กตรอน ฉันเดาว่าปัญหาเกิดจากการใช้ webpack แต่ฉันไม่รู้ว่าจะแก้ไขมันอย่างไร จากตัวอย่าง ฉันลองรวมเป้าหมาย: 'node', node: { global: 'window', crypto: 'empty', กระบวนการ: true, module: false, clearImmediate: false, setImmediate: false } ใน config ปัญหายังคงเหมือนเดิม - person AishApp; 02.05.2016
comment
แอพของคุณทำงานที่ไหน? ในเบราว์เซอร์? จากนั้นคุณจะไม่สามารถใช้เชลล์ js ที่นั่นได้ เนื่องจากไม่อนุญาตให้รันคำสั่งเชลล์ระบบ - person tenbits; 02.05.2016
comment
สถานการณ์ของคุณคืออะไร? คุณต้องการให้ผู้ใช้นำทางไปยังหน้าเว็บของคุณและคุณต้องการรันคำสั่งเชลล์บนเครื่องของเขาหรือไม่? แล้วมันเป็นไปไม่ได้เลย ลองจินตนาการถึงปัญหาด้านความปลอดภัยทั้งหมดที่ผู้คนจะมี) คุณต้องการเรียกใช้คำสั่งใด คุณสามารถใช้ อิเล็กตรอน ได้ เป็นต้น นี่คือเบราว์เซอร์แบบสแตนด์อโลนที่มี nodejs อยู่ข้างใน มันทำงานเหมือนแอปพลิเคชันระบบปกติ จากนั้นผู้คนจะดาวน์โหลดแอปพลิเคชันของคุณ ติดตั้ง และเรียกใช้เหมือนแอปปกติ ดังนั้น นอกเหนือจากเอ็นจิ้นการเรนเดอร์เบราว์เซอร์แล้ว คุณสามารถใช้ nodejs ได้เช่นกัน - person tenbits; 02.05.2016
comment
สถานการณ์ของฉัน: เมื่อผู้ใช้คลิกที่ปุ่มในเบราว์เซอร์ ฉันควรนำทางไปยังเซิร์ฟเวอร์ของฉัน โดยที่ฉันควรดำเนินการคำสั่งเชลล์เพื่อสร้าง สร้าง และเรียกใช้ไฟล์ จากนั้นจัดเตรียมไฟล์สุดท้ายกลับไปยังผู้ใช้เพื่อดาวน์โหลด ฉันลองใช้ node child_process แต่มันกลับมาเป็นสิ่งที่คุณอธิบายก่อนหน้านี้อีกครั้ง มีวิธีใดบ้างที่จะบรรลุเป้าหมายนี้? - person AishApp; 02.05.2016
comment
ใช่ คุณต้องจัดเตรียม API สำหรับสิ่งนี้โดยใช้เซิร์ฟเวอร์ NodeJS บางตัว นี่ไม่เกี่ยวอะไรกับเชิงมุมเลย ผู้ใช้คลิกปุ่ม จากนั้นคุณส่งคำขอ ajax ไปยัง API นั้น จากนั้นจุดสิ้นสุดจะทำงานทั้งหมดและส่งการตอบกลับกลับมา ดังนั้นคุณต้องมองไปที่ expressjs ดังนั้นแอปพลิเคชันของคุณจะประกอบด้วย 2 ส่วน - ส่วนหน้า (เชิงมุม js, เบราว์เซอร์) และส่วนหลัง - จุดสิ้นสุด RESTful ด้วย NodeJS - person tenbits; 02.05.2016
comment
ขอบคุณมาก. ฉันจะตรวจสอบกับ expressjs ขอขอบคุณอีกครั้งสำหรับเวลาอันมีค่าของคุณ - person AishApp; 02.05.2016
comment
ยินดีต้อนรับ หากคุณมีคำถามเพิ่มเติม กรอกได้ฟรีเพื่อสร้างคำถามใดๆ - person tenbits; 02.05.2016