Javascript 使用Redux,在JS模块的不同文件夹中键入脚本。如何告诉它模块所在的位置?

Javascript 使用Redux,在JS模块的不同文件夹中键入脚本。如何告诉它模块所在的位置?,javascript,typescript,requirejs,typescript-typings,Javascript,Typescript,Requirejs,Typescript Typings,我正在应用程序中使用Redux。我使用VisualStudio2015和npm作为依赖项下载Redux 我有以下文件夹结构: MySolution.sln ├── node_modules │ ├── redux │ │ ├── index.d.ts | | ├── dist │ │ | ├── redux.js │ │ | ├── redux.min.js ├── Scripts │ ├── myscript.ts │ ├── myscrip

我正在应用程序中使用Redux。我使用VisualStudio2015和npm作为依赖项下载Redux

我有以下文件夹结构:

MySolution.sln
├── node_modules
│   ├── redux
│   │   ├── index.d.ts
|   |   ├── dist
│   │   |   ├── redux.js
│   │   |   ├── redux.min.js
├── Scripts
│   ├── myscript.ts
│   ├── myscript.js
Redux的节点结构与使用npm下载时相同

npm安装redux

我有一个TypeScript脚本(myscript.ts),它利用Redux,我从中导入
createStore
combinereducer

myscript.ts

/// <reference path="../node_modules/redux/index.d.ts" />
import { combineReducers, createStore } from "../node_modules/redux/index";

//... more code
const myApp = combineReducers({
    SelectedAnswers: selectedAnswers
});

var store = createStore(myApp);
如您所见,我的代码使用导入脚本,这是由VisualStudio/TypeScript自动生成的

出于编译目的,这很好,因为它指向
。/../../node\u modules/redux/index
,这将允许它拾取
index.d.ts
,这是TypeScript键入文件(明确键入)

因此,当应用程序实际运行时,我的问题就出现了,Redux的真正脚本位于下一个文件夹中,
/Redux.js
,因此当我运行脚本时,它告诉我模块无法加载

如何在运行时告诉TypeScript脚本位于
/redux

我认为如果我在
require.config
中针对生成的
define()
方法中出现的类型脚本中的名称htat指定它,我可以告诉RequireJS脚本在哪里,但这没有任何效果:

require.config({
    baseUrl: "/",
    paths: {
        "../node_modules/redux/index": "../node_modules/redux/dist/redux"
    }
});
谢谢你的帮助


注意:如果我将
index.d.ts
移动到与
redux.js
相同的文件夹中,并将其命名为
redux.d.ts
,效果会很好,但这不是npm下载中的显示方式。我不想每次更新时都将它们移动到同一个文件夹中。

好吧,看来我的痛苦主要是因为我混淆了内部模块和外部模块的概念

外部模块通常不会在组成应用程序的TypeScript文件的tapestry中被它们的相对路径引用,它们应该在
require.config()
中指定

内部模块和类型脚本文件可以通过相对路径引用

因此答案是,
redux
,一个外部模块,应该在TypeScript中通过redux定义文件中指定的名称来引用

import { combineReducers, createStore } = require("redux");

//... now we can use the imported external module
const myApp = combineReducers({
    SelectedAnswers: selectedAnswers
});

var store = createStore(myApp);
您还必须确保您有外部模块的打字,我没有,因此这导致我的TypeScript文件编译失败,出现错误
找不到模块“redux”
。因此,我通过安装明确的类型定义获得了类型,这允许TypeScript文件进行编译:

安装包react-redux.TypeScript.DefinitelyTyped

似乎这通常适用于您可能想要导入的大多数外部模块,但如果它们不是,您可以指定自己的定义(将其放在解决方案中的*.d.ts文件中),这将允许您键入脚本文件来编译:

// This can be redux, or any other module that you'd like to use in require() to enable it to compile your TypeScript code
declare module "redux" {
    var _temp: any;
    export = _temp;
}
当然,如果这样做,您将无法获得intellisense,因此打字脚本是首选

在设置作为应用程序入口点的
require.config()
的属性时,您应该:

  • 指定相对于
    baseUrl的外部模块位置
  • 指定要解析为相对位置的内部模块
下面是我的示例的入口点示例(main.ts,编译为main.js供以后使用):

这可以从应用程序的页面中调用,如下所示:

<script "/node_modules/requirejs/require.js" data-main="scripts/main.js"></script>

require.config({
    baseUrl: "/", // The base url
    paths: {
        // Named external module (redux in this case)
        "redux": "../node_modules/redux/dist/redux"
    }
});

// Bootstrap the entry point module, notice that this is an 'internal module', hence the relative location being used as the module name
require(["Scripts/myscript"], () => {
    console.log("Your internal module has been resolved and should be running now!")
});
<script "/node_modules/requirejs/require.js" data-main="scripts/main.js"></script>