如何在node.js-Backend以及我的前端的单独js文件中使用函数?

时间:2015-08-12 13:49:19

标签: javascript node.js frontend backend

在我的Web App中,我在某些js文件中有一些数学函数。为了能够在我的Node.js-Back-end中需要它,我必须使用module.exports在所述文件中导出所述函数。

    //Needed for Usage in the Back-end
    module.exports = {
        calculate: calculate
    };

当我现在想在前端使用这个文件时,它仍然包含上面的代码片段,这不是致命的,但有点不方便。

有没有更好的方法在前面和后面使用js文件而不重复代码?

此致 Claas M。

5 个答案:

答案 0 :(得分:1)

您可以随时检查您是否在Node.js中,如果不是仅使用不同的功能

if(typeof process !== 'undefined' && process.argv[0] === "node") {
    // this is node
}

答案 1 :(得分:1)

只需检查是否存在module.exports

if (typeof module !== 'undefined' && module.exports) {
  module.exports = {
    calculate: calculate
  };
} else {
  window.calculate = calculate;
}

答案 2 :(得分:1)

在脚本文件的末尾使用它:

var Ducky = {
    quak: function quak() {
        return "Quack!";
    }
};

if (exports !== undefined && exports !== null) {
    exports.Ducky = Ducky;
} else if (module !== undefined && module !== null &&
        module.exports !== undefined && module.exports !== null) {
    module.exports.Ducky = Ducky;
} else if (window !== undefined && window !== null) {
    window.Ducky = Ducky;
}

修改:
您可能希望将这些内容打包到(function(){})()表达式中,因此Ducky不会是全局变量。

答案 3 :(得分:1)

您可以使用外部设备替换浏览器端的节点require

在这种情况下,我的偏好是Browserify

通过一些代码修改,您还可以尝试RequireJS

答案 4 :(得分:1)

如果您的服务器端模块中没有任何require,但只有module.exports,那么您可以保留服务器端代码,并将一小段代码放入客户端加载任何此类模块之前的页面:

客户端JavaScript

window.module = {
  set exports (obj) {
    for(p in obj) {
      obj.hasOwnProperty(p) && (window[p] = obj[p]);
    }
  }
};

此代码段会将您在服务器端代码中定义的所有导出函数放入module.exports并导出到window。这样您就不需要通过添加冗余内容来修改所有共享代码,而只需将一小段代码添加到您的客户端。

<强> Plunker

http://plnkr.co/edit/2fWlNN5w7R4Mcdv9VJ5T?p=preview

从IE9开始支持所有现代浏览器:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set