我有一个我编写的 Typescript 库,其发出如下。不过,我不确定如何从该模块导入。
node_modules/my-module/dist/index.js(部分)
define("services/UserService", ["require", "exports", ..., "services/BaseService"], function (require, exports, ..., BaseService_31) {
"use strict";
var UserService = (function (_super) {
// ... stuff here ...
return UserService;
}(BaseService_31.BaseService));
exports.UserService = UserService;
});
我已经使用 npm
安装了此软件包并按如下方式配置了 JSPM:
config.js(部分)
System.config({
defaultJSExtensions: true,
transpiler: "none",
paths: {
"*": "dist/*",
"github:*": "jspm_packages/github/*",
"npm:*": "jspm_packages/npm/*",
"npm-ext:*": "node_modules/*"
},
map: {
...
"my-module": "npm-ext:my-module/dist/index.js",
...
}
});
我期望能够按如下方式导入此类...
import {UserService} from "my-module/services/UserService";
我希望 SystemJS 解析到 my-module
的路径,然后找到 services/UserService
模块,并获取单个导出 UserService
。但在 Chrome 控制台中我看到这是正在加载的路径:
node_modules/my-module/dist/index.js/models/UserService.js
导入这样的模块的正确方法是什么?
额外奖励:如何包含 index.js
的完整路径?
最佳答案
您的库代码是使用命名的定义发出的
define("services/UserService",
而且看起来index.js文件中定义了几个这样的模块,也就是说index.js是一个bundle。
使用 SystemJS 导入此类模块的唯一方法是
import {UserService} from "services/UserService";
也就是说,导入的模块名称必须与define
指定的名称完全匹配。在您的情况下,文件的位置不会以任何方式影响模块名称。
现在,SystemJS 必须配置为在看到该导入时加载库文件 node_modules/my-module/dist/index.js
。对于 bundle ,首选方式是通过 bundles config :
bundles: {
"npm-ext:my-module/dist/index.js": ["services/UserService.js"]
}
此处的模块名称 services/UserService.js
必须具有 .js
扩展名,因为它必须与 defaultJSExtesions:true
之后导入的模块名称匹配已应用。
如果您希望将模块导入为 my-module/services/UserService.js
,那么您需要确保它是使用该名称注册的。最简单的方法是在编译库时拥有相应的源文件结构 - 即在 my-module/services
文件夹中拥有 UserService.ts 。
您可以在SystemJS module format docs中找到有关命名定义的更多信息。 ,其中特别提到
Named defines are supported and will write directly into the loader registry.
A single named define will write into the loader registry but also be treated as the value of the module loaded if the names do not match. This enables loading a module containing define('jquery', ....
P.S.您的浏览器尝试加载
node_modules/my-module/dist/index.js/models/UserService.js
模型
从哪里来?
关于javascript - 如何从嵌套模块导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39313000/