【问题标题】:Cannot find module "shelljs" on including the lib in angular 2 typescript在 angular 2 typescript 中包含 lib 时找不到模块“shelljs”
【发布时间】:2016-08-23 03:49:21
【问题描述】:

我想将 shelljs 库包含到 Angular 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’”。请帮助我将库包含在我的项目中。

【问题讨论】:

  • 不知道shell.js 是如何工作的,但试试let shell = require('shelljs/global'); shell.exec(...

标签: node.js typescript angular webpack child-process


【解决方案1】:

使用tsd 管理您的所有输入。

从你的项目目录:

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

然后在 foo.ts 中包含对 shelljs 的引用:

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

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

基于cmets,总结如下:

只能在NodeJS 环境中使用shelljs。这可以是原始的nodejs 实例,也可以是一些自身包含nodejs 的项目,例如Electron

您还应该注意您使用的是哪个模块系统。对于NodeJS,您可以使用CommonJS,而无需任何其他捆绑程序。但是,如果您为前端编译 TypeScript,而 NodeJS 不存在,那么您还应该将 CommonJS 模块与 browserify 捆绑在一起。或者您可以使用其他类型的模块,例如 amdSystemJS,然后在 typescript 编译器选项中设置 `"module": "system"。查看所有选项here

【讨论】:

  • tsd 已更新为类型,当我包含它时,我收到错误,因为模块总是在“node_modules”文件夹下查看。所以我安装了 shelljs npm 并将我的类型文件放在 node_modules/shelljs 文件夹中。我仍然收到错误为“找不到模块 shelljs”。 Node.d.ts 默认在 angular2 ts 下可用。
  • 您不应该在node_modules 中放置任何东西。使用tsdshelljs 安装类型,并使用/// &lt;reference path="shelljs/shelljs.d.ts" /&gt; 在文件中包含正确的路径。请注意,路径是相对于您当前的 .ts 文件的。
  • 如果没有在 node_modules 中安装 shelljs,我在 compile.c:\Users\user\Desktop\Samples\Angular_Projects\myProject1\myproj1\node_modules\shelljs 上收到如下错误(模块为目录)安装了 node_modules 中的 shelljs 后,我在运行时收到“未捕获的 ReferenceError:require is not defined”,我的应用程序上显示空白屏幕
  • 是的,你必须安装npm install shelljs --save,但你不应该修改它,因为你写了“将我的打字文件放在 node_modules/shelljs 文件夹中”。该模块的类型是单独安装的:tsd install shelljs --save。那么ReferenceError 的问题:实际上这意味着 typescript 已成功编译并运行,但 webview 无法识别 require 方法。你用Electron吗?然后连线,因为 electron 支持 nodejs require.
  • 是的,您必须使用一些 NodeJS 服务器为此提供 API。这与角度无关。用户单击按钮,然后您向该 api 发送 ajax 请求,端点完成所有工作并发回响应。所以你必须看向expressjs。因此,您的应用程序将包含两部分 - 前端(angularjs、浏览器)和后端 - 带有 NodeJS 的 RESTful 端点。
猜你喜欢
  • 2016-10-17
  • 2016-06-08
  • 2016-12-16
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多