requirejs内置了exports了吗?

发布于 2022-09-05 14:57:34 字数 1381 浏览 21 评论 0

我在使用 babel 来将 es6 的模块代码转换为符合 AMD 规范的代码:

// .babelrc
{
  "env": {
    "production": {
      "presets": ["es2015"],
      "plugins": ["transform-runtime"]
    },
    "develop": {
      "presets": ["es2015"],
      "plugins": ["transform-runtime", "transform-es2015-modules-amd"]
    }
  }
}
// modules.js
function Modules(name) {
  this.name = name;
}
Modules.prototype.say = function () {
  console.log(this.name);
}
export default Modules;
// babel 编译后的代码
define(["exports"], function (exports) {
  "use strict";

  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  function Module(name) {
    this.name = name;
  }
  Module.prototype.say = function () {
    console.log(this.name);
  };
  exports.default = Module;
});
require.config({
  baseUrl: './dist',
  path: {
    modules: 'modules.js',
  }
})

require(['modules'], function (Modules) {
  console.log(Modules); // {__esModule: true, default: ƒ}
  const man = new Modules.default('bob');
  man.say(); // always has value
})

问题1: 我看到这种写法不是定义个一个依赖exports的模块么? 但是 exports 这个模块并没有啊?这样为什么不会报错呢?
问题2: babel 编译后的代码里,定义的模块的回调函数里没有 reuturn 任何值, 为什么我在 main.js 中还能引入 这个模块的代码呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

徒留西风 2022-09-12 14:57:34

其实两个问题都和exports有关

// babel 编译后的代码
define(["exports"], function (exports) {
  "use strict";

  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  function Module(name) {
    this.name = name;
  }
  Module.prototype.say = function () {
    console.log(this.name);
  };
  exports.default = Module;
});

以上是babel转换过后的代码,其中第一行就定义了一个exports,相当于是定义了一个供外部引用的空对象。
所以可以在exports上定义一个属性,然后引用这个模块时也可以获取到这个属性。

蓝眸 2022-09-12 14:57:34

requirejs应该内置了exports这个模块,函数执行的时候,这个对象会传进来。
不用return,是应为 main.js 使用的模块中导出的值,不需要return。

 exports.default = Module;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文