为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Node.js和浏览器之间共享代码?

如何在Node.js和浏览器之间共享代码?

摇曳的蔷薇 2019-10-05 11:19:57
我正在使用JavaScript客户端(在浏览器中运行)和Node.js服务器创建一个小型应用程序,并使用WebSocket进行通信。我想在客户端和服务器之间共享代码。至少可以说,我才刚刚开始使用Node.js,而我对现代JavaScript的了解还有些生疏。因此,我仍然对CommonJS require()函数有所了解。如果我使用“导出”对象创建程序包,那么我将看不到如何在浏览器中使用相同的JavaScript文件。我想创建一套在两端使用的方法和类,以方便编码和解码消息以及其他镜像任务。但是,Node.js / CommonJS打包系统似乎使我无法创建可在两侧使用的JavaScript文件。我也尝试使用JS.Class来获得更严格的OO模型,但是我放弃了,因为我无法弄清楚如何使提供的JavaScript文件与require()一起使用。我在这里想念什么吗?
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

如果您想编写一个既可以在客户端又可以在服务器端使用的模块,那么我有一篇简短的博客文章,介绍了一种快速简便的方法:为Node.js和浏览器编写,实质上是以下内容(this与相同window) :


(function(exports){


    // Your code goes here


   exports.test = function(){

        return 'hello world'

    };


})(typeof exports === 'undefined'? this['mymodule']={}: exports);

另外,也有一些旨在在客户端实现Node.js API的项目,例如Marak的gemini。


您可能还对DNode感兴趣,它使您可以公开一个JavaScript函数,以便可以使用基于JSON的简单网络协议从另一台计算机上调用它。


查看完整回答
反对 回复 2019-10-05
?
开满天机

TA贡献1786条经验 获得超12个赞

检出使它能够在Node.js模块模式,AMD模块模式以及浏览器中的全局模式下工作的jQuery源代码:


(function(window){

    var jQuery = 'blah';


    if (typeof module === "object" && module && typeof module.exports === "object") {


        // Expose jQuery as module.exports in loaders that implement the Node

        // module pattern (including browserify). Do not create the global, since

        // the user will be storing it themselves locally, and globals are frowned

        // upon in the Node module world.

        module.exports = jQuery;

    }

    else {

        // Otherwise expose jQuery to the global object as usual

        window.jQuery = window.$ = jQuery;


        // Register as a named AMD module, since jQuery can be concatenated with other

        // files that may use define, but not via a proper concatenation script that

        // understands anonymous AMD modules. A named AMD is safest and most robust

        // way to register. Lowercase jquery is used because AMD module names are

        // derived from file names, and jQuery is normally delivered in a lowercase

        // file name. Do this after creating the global so that if an AMD module wants

        // to call noConflict to hide this version of jQuery, it will work.

        if (typeof define === "function" && define.amd) {

            define("jquery", [], function () { return jQuery; });

        }

    }

})(this)


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 727 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信