【问题标题】:Including JavaScript class definition from another file in Node.js在 Node.js 中包含来自另一个文件的 JavaScript 类定义
【发布时间】:2011-10-23 07:46:58
【问题描述】:

我正在为 Node.js 编写一个简单的服务器,并且我正在使用我自己的名为 User 的类,它看起来像:

function User(socket) {
    this.socket = socket;
    this.nickname = null;

    /* ... just the typical source code like functions, variables and bugs ... */

    this.write = function(object) {
        this.socket.write(JSON.stringify(object));
    }
};

然后在这个过程的后期我经常实例化它:

var server = net.createServer(function (socket) {
    /* other bugs */
    var user = new User(socket);
    /* more bugs and bad practise */
});

我可以将我的 User 类定义移动到另一个 javascript 文件并以某种方式“包含”它吗?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    你可以这样做:

    user.js

    class User {
      //...
    }
    
    module.exports = User // ? Export class
    

    server.js

    const User = require('./user.js')
    
    let user = new User()
    

    这称为CommonJS 模块。

    ES 模块

    从 Node.js 版本 14 开始,可以将 ES 模块与 CommonJS 一起使用。在ESM documentation 中阅读更多相关信息。

    user.mjs(?扩展很重要)

    export default class User {}
    

    server.mjs

    import User from './user.mjs'
    
    let user = new User()
    

    【讨论】:

    • 如果,用户有一些输入参数,比如 module.exports = function User(data)。然后 var user = new User();应该改成 var user = new User(data);?
    • 是的。 User 是常用的js函数。
    • 你不需要在 server.js 中创建常量 User。将 users.js 的最后一行更改为 module.exports = new User(); 这将在每次需要模块时创建一个新的 User 实例。然后,您可以像这样简单地要求每个变量的模块:let user = require('./user.js');
    • @Barnack 我有几个答案。哪个是错的,哪个是正确的?
    • @pashaRumkin 在本地实例化对象,但我得到 TypeError: is not a constructor
    【解决方案2】:

    使用 ES6,你可以拥有user.js:

    export default class User {
      constructor() {
        ...
      }
    }
    

    然后在server.js中使用

    const User = require('./user.js').default;
    const user = new User();
    

    【讨论】:

    • 当我按照您的描述进行操作时,我会得到一个SyntaxError: Unexpected token export...我有节点版本v10.16.3
    【解决方案3】:

    修改你的类定义,如下所示:

    exports.User = function (socket) {
      ...
    };
    

    然后将文件重命名为user.js。假设它位于主脚本的根目录中,您可以像这样包含它:

    var user = require('./user');
    var someUser = new user.User();
    

    这是快速而肮脏的版本。如果您想了解更多信息,请阅读 CommonJS Modules

    【讨论】:

    • socket怎么了?应该是 var someUser = new user.User(socket);
    【解决方案4】:

    除了这里为 ES6 提供的方法之外的另一种方法

    module.exports = class TEST{
        constructor(size) {
            this.map = new MAp();
            this.size = size;
    
        }
    
        get(key) {
            return this.map.get(key);
        }
    
        length() {
            return this.map.size;
        }    
    
    }
    

    并包含与

    相同的内容
    var TEST= require('./TEST');
    var test = new TEST(1);
    

    【讨论】:

      【解决方案5】:

      如果您将此附加到user.js

      exports.User = User;
      

      然后在server.js 你可以这样做:

      var userFile = require('./user.js');
      var User = userFile.User;
      

      http://nodejs.org/docs/v0.4.10/api/globals.html#require

      另一种方式是:

      global.User = User;
      

      那么这在server.js 中就足够了:

      require('./user.js');
      

      【讨论】:

        【解决方案6】:

        代替 myFile.js 编写您的文件,如 myFile.mjs。这个扩展带有 es6 的所有优点,但我的意思是我向你推荐 webpack 和 Babel

        【讨论】:

          【解决方案7】:

          我只想指出,这里的大多数答案都不起作用,如果“module.exports.yourClass”方法一直在变化,或者人们刚刚输入了错误的答案,我是 NodeJS 和 IDK 的新手。

          // MyClass
          
          module.exports.Ninja = class Ninja{
              test(){
                  console.log('TESTING 1... 2... 3...');
              };
          }
          
          //Using MyClass in seprate File
          
          
          const ninjaFw = require('./NinjaFw');
          
          let ninja = new ninjaFw.Ninja();
          ninja.test();
          
          
          • 这是我目前使用的方法。我喜欢这种语法,因为 module.exports 与类声明位于同一行,并且在 imo 中清理了一些代码。另一种方法是:
          //  Ninja Framework File
          
          
          class Ninja{
              test(){
                  console.log('TESTING 1... 2... 3...');
              };
          }
          
          
          module.exports.Ninja = Ninja;
          
          
          • 两种不同的语法,但最终得到相同的结果。只是语法麻醉的问题。

          【讨论】:

            猜你喜欢
            • 2011-10-09
            • 1970-01-01
            • 2015-11-28
            • 1970-01-01
            • 2014-09-18
            • 2023-03-18
            • 1970-01-01
            • 1970-01-01
            • 2021-11-04
            相关资源
            最近更新 更多