javascript - 如何从嵌套模块导入?

标签 javascript typescript ecmascript-6 systemjs jspm

我有一个我编写的 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/

相关文章:

javascript - 从库导出枚举并在消费者 typescript 项目中使用它

javascript - 如何用分号分隔逗号、分号和逗号分隔的短语?

javascript - Angular :输入时模糊输入

javascript - 无法读取未定义的属性 'bind'。 react .js

javascript - 在 jquery 中获取文本和图像

javascript - flutter(Dart)有没有类似js bind的功能?

javascript - 有没有办法将字段设置在子对象范围内,同时可以从父对象访问?

javascript - 注销 channel 监听器

javascript - 为什么 Bootstrap 4 在 es6 类中使用私有(private)方法?

javascript - 如何在 ES6 中柯里化(Currying)递归函数