Node.js和前端之间共享的模块中的模块语法和依赖关系

时间:2014-09-12 09:22:51

标签: javascript node.js requirejs frontend commonjs

我开始了解node.js和javascript前端,并且在前端和后端之间共享模块/组件(在这种情况下,带有express的Node.js)已成为有趣的(特别是在使用React.js时)。这不是一个新问题,但我找不到适合我当前需求的好方法。

我想要的是什么:

在前端和Node后端使用项目模块和子模块以及require语句中的工作路径,以及用于文件/模块加载的最小可能的bolierplate代码。希望无需构建步骤。

例如,我有一个用于呈现HTML的react组件。当webapp处于活动状态时,此组件用于前端,而在预生成html时用于后端。这只是一个示例,主要要求如上所述。

最佳案例,项目模块文件(不是实际测试的代码):

var React = require('react'),
    MyLocalSubmodule = require('path/modulename');

var ThisComponent = React.createClass({
    /* ...something.... */
});

module.exports = ThisComponent;

问题:

  1. 如果我使用纯CommonJS语法,如标准节点模块(没有define和module.export),语法非常好用,但模块不能在前端开箱即用,除非我使用browserify,webpack等构建前端代码。这不是一个大问题,但我希望减少所需的构建步骤数,以便尽可能直接使用代码。
  2. 问题:是否有任何前端加载程序可以运行未打包的CommonJS模块而无需预先构建它们,模块文件中没有任何样板或类似的黑客攻击?

    1. 如果我在定义和返回时使用类似AMD的语法,很容易使它们在节点上工作(使用requirejs,amdefine或somilar模块),但是我遇到了模块路径的问题。如果我使用baseUrl在前端配置require.js,我可以通过require config中的路径包含项目模块文件。当我需要包含另一个模块(如子React组件)时,我需要在require-config中定义该模块的路径。到现在为止还挺好。然后,如果我尝试在node / express上运行此模块,则渲染第一个模块(基于快速视图路径),但要求第一个模块内的子模块不起作用,因为require然后查找相对的本地模块到当前模块目录的路径,而不是基于快速视图路径的路径。如果我把一个相对路径放到子组件(如require('。/ subdir / mySubmodule')或require('../ otherdir / mySubmodule)),那么它在前端的Require.js中不起作用。我还没有找到任何告诉Node在给定路径中查看的方法,如果我在require名称中不包含任何目录指示(如require('path / to / component')),那么我可以以相同的方式使用固定的基础目录和require.js前端一样。 (注意:我想避免设置像NODE_PATH这样的环境变量来解决节点路径问题)。而且,我还没有找到一种方法来在浏览器中的require.js上使用相对于当前模块文件的路径(Node的方式)。
    2. 问题:是否有一种非hackish好方法要求在require语句中具有相同名称语法的模块内的本地(项目)模块和子模块(var myModule = require('frontend-backend-shared-syntax) ');)在前端和Node后端?

      上一个问题:制作节点/前端可共享项目模块(包括使用子模块)的最佳建议方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用Browserify API按需捆绑JavaScript。

有几个开源项目允许您这样做(例如https://www.npmjs.org/package/browserify-middleware)。

要在一个模块中创建包含浏览器和节点代码的模块,您可以指定一个"浏览器" package.json文件中的属性。然后,Browserify将使用指定的文件作为浏览器代码中的入口点,而节点将加载" main"中指定的文件。