Javascript 使用Redux,在JS模块的不同文件夹中键入脚本。如何告诉它模块所在的位置?
我正在应用程序中使用Redux。我使用VisualStudio2015和npm作为依赖项下载Redux 我有以下文件夹结构: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
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的外部模块位置
- 指定要解析为相对位置的内部模块
<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>