Не удается найти модуль shelljs при включении библиотеки в машинописный текст angular 2

Я хочу включить библиотеку shelljs в машинописный текст angular 2. Я включил файл shelljs.d.ts в свою библиотеку node_modules/shelljs.

Мой пакет.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
  },

Мой ТС-файл:

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, либо некоторые проекты, которые содержат nodejs в себе, например Electron.

Также вам следует обратить внимание на то, какую модульную систему вы используете. Для NodeJS вы можете использовать CommonJS без дополнительных упаковщиков. Но если вы компилируете свои TypeScript для внешнего интерфейса, где 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 я получаю следующую ошибку при компиляции.c:\Users\user\Desktop\Samples\Angular_Projects\myProject1\myproj1\node_modules\shelljs не существует (модуль как каталог). я получаю Uncaught ReferenceError: требование не определено во время выполнения с пустым экраном, отображаемым в моем приложении - person AishApp; 02.05.2016
comment
Да, вам нужно установить npm install shelljs --save, но вам не следует его изменять, поскольку вы написали, что поместили файл моих типов в папку node_modules/shelljs. Для этого модуля типизации устанавливаются отдельно: tsd install shelljs --save. Итак, проблема с ReferenceError: на самом деле это означает, что машинописный текст был успешно скомпилирован и запущен, но веб-просмотр не распознает метод require. Вы используете Electron? Как это потом подключено, так как электрон поддерживает nodejs require. - person tenbits; 02.05.2016
comment
нет. я не использую электрон. Я предполагаю, что проблема связана с использованием webpack. Но я не знаю, как это решить. Например, я попытался включить target: 'node', node: {global: 'window', crypto: 'empty', process: true, module: false, clearImmediate: false, setImmediate: false} в config. Тем не менее проблема остается той же - person AishApp; 02.05.2016
comment
Где работает ваше приложение? В браузере? Тогда вы не можете использовать там shelljs, так как он не позволяет запускать команды системной оболочки. - person tenbits; 02.05.2016
comment
Каков ваш сценарий? Вы хотите, чтобы какой-то пользователь перешел на вашу веб-страницу, а затем вы хотите выполнить какую-то команду оболочки на своем компьютере? Тогда это вообще невозможно. Представьте себе все проблемы с безопасностью, которые могут возникнуть у людей). Какие команды вы хотите запустить? Например, вы можете использовать electron. Это автономный браузер с nodejs внутри. Он ведет себя как обычное системное приложение. Затем люди загружают ваше приложение, устанавливают его и запускают как обычное приложение. Итак, помимо движка рендеринга браузеров, вы также можете использовать вещи nodejs. - person tenbits; 02.05.2016
comment
Мой сценарий: когда пользователь нажимает кнопку в браузере, я должен перейти на свой сервер, где я должен выполнить команду оболочки для создания, сборки и запуска файла, а затем предоставить окончательный файл обратно пользователю для загрузки. Я попытался использовать узел child_process, но снова вернулся к тому, что вы мне объяснили раньше. Любые способы добиться этого? - person AishApp; 02.05.2016
comment
Да, вы должны предоставить API для этого, используя какой-либо сервер NodeJS. Это не имеет ничего общего с угловым. Пользователь нажимает кнопку, и вы отправляете ajax запрос к этому API, и конечная точка выполняет всю работу и отправляет ответ. Таким образом, вы должны смотреть в сторону expressjs. Таким образом, ваше приложение будет состоять из 2 частей — фронтенда (angularjs, браузер) и бэкэнда — RESTful endpoints с NodeJS. - person tenbits; 02.05.2016
comment
Большое спасибо. Я проверю с помощью expressjs. Еще раз спасибо за ваше драгоценное время - person AishApp; 02.05.2016
comment
Добро пожаловать, если у вас есть дополнительные вопросы, заполните, чтобы создать любой. - person tenbits; 02.05.2016