sách gpt4 ai đã đi

angularjs - export/module.exports 有什么用?

In lại 作者:行者123 更新时间:2023-12-03 15:18:23 29 4
mua khóa gpt4 Nike

今天我在我的 AngularJS 项目中采用了 Browserify,但是我还不清楚。在所有示例和博客文章中,我都看到了这样的东西:

/app.js:

require('./messages');
angular.module('sling', ['sling.messages']);

/messages/index.js:
exports = angular.module('sling.messages', [])
.controller('MessagesListCtrl', require('./MessagesListCtrl'));

/messages/MessagesListCtrl.js:
module.exports = function() {
// ...
});

当然,这行得通,但为什么要这样做?我已经像这样实现了它,而且效果也非常好,并且对于 AngularJS 项目来说感觉更正常:

/app.js:
require('./messages');
angular.module('sling', ['sling.messages']);

/messages/index.js:
angular.module('sling.messages', []);
require('./MessagesListCtrl');

/messages/MessagesListCtrl.js:
angular.module('sling.messages').controller('MessagesListCtrl', function() {
// ...
});

换句话说,我完全跳过了exports/module.exports,只使用了 require。基本上包括带有 Controller 、服务、过滤器等的文件。

我这样做对吗?我的意思是这一切都有效,但我以后会遇到麻烦吗?

1 Câu trả lời

使用 Browserify 的主要(并且是唯一的)原因是如果你想在浏览器中拥有 CommonJS 模块(即 NodeJS 模块)。 CommonJS 模块通过隐含的“模块”范围保持在全局范围之外。您可以通过扩充每个模块具有的“导出”对象来选择从模块范围(通常是模块的入口点或主要功能)公开的内容。

所以一个“真正的”CommonJS 模块看起来像这样。

文件一:

// a.js

function doSomething() {
console.log("I am doing something");
}

module.exports = doSomething

文件 B:
// b.js

doSomething();
// Exception - attempt to call a non-existent function

文件 C:
// c.js
var doSomething = require('a');
doSomething();
// logs "I am doing something"

在没有模块作用域的浏览器中, a.js将使用 doSomething 函数扩大全局范围,因为它被声明为全局。 Browserify 通过将每个捆绑的模块包装到一个函数包装器中来解决这个问题,并为包含的模块提供一个“导出”对象作为该包装器的参数。

输入 AngularJS。你有两种方法可以在这里使用,我假设你没有使用 require('angular') 是第一种:
  • 在经过 Browserify 转译的捆绑脚本之前,将 AngularJS 作为硬编码脚本包含在 index.html 中。
  • Shim AngularJS 使其附加到导出对象而不是窗口(使用类似 browserify-shim 的东西),然后像任何其他模块一样使用 require 导入它。

  • 我更喜欢第二种方法,因为使用 Browserify 为您提供模块范围然后使项目的主要依赖项成为全局窗口有点奇怪。

    然而,AngularJS 已经有了自己的依赖注入(inject)驱动的模块系统。当您声明 angularJS 组件时,您将它们附加到模块对象上,这些模块对象本身已附加到 angular目的。这意味着 exports在 Angular 的情况下,你的 angularJS 模块文件的对象本质上是多余的,因为只要文件执行, angular对象将使用您的模块和组件进行扩充。

    您仍然需要“要求”这些文件,否则 Browserify 将不会捆绑它们,它们将永远不会执行,并且它们永远不会增加 angular对象与您的模块。但是您不需要为 Angular 的导出添加任何内容,因为 angular对象是您的导出。

    那么为什么我要花这么多时间来解释 CommonJS 模块和导出是如何工作的呢?因为希望您使用 Browserify 的另一个原因是允许您在浏览器应用程序中使用托管在 NPM 上的模块。这些模块中的大多数都是非 Angular 的 commonJS 模块,这意味着它们的功能通过导出公开。在这种情况下,当您需要它们时,将它们的导出捕获到一个变量中很重要,例如我在 c.js 中所做的。多于。同样,如果您编写一些模块并将它们发布到 NPM,您的用户会期望您将模块的入口点添加到 exportsTrong của bạn gói.json 中声明为 main 的文件的对象.

    关于angularjs - export/module.exports 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22489853/

    29 4 0
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com