预加载/预先要求的.js路由文件目录

时间:2015-08-01 07:04:40

标签: node.js express

将Express与Node.js一起使用,我们可能会这样做:

app.use('api/:controller/:action/:id', function(req,res,next){

   var controller = req.params.controller;
   var action = req.params.action;

   var route = require('./routes/' + controller + '/' + action);

   route(req,res,next);

}

现在这一切都很好,除了至少有一个问题:路由文件是在运行时动态加载的,如果这个文件还没有被要求的话。这意味着它至少有点慢。

有人有一个脚本可以通过目录进行递归并在服务器首次启动时预先加载/预先要求所有.js文件吗?

我也有类似的前端问题,使用RequireJS。解决方案似乎是编写一个bash脚本,将脚本中的所有.js文件路径及其子目录写入文本文件。然后当服务器启动时,它会读取该文本文件并要求文件文件中列出的目录中的所有文件。这是最好的方法吗?

2 个答案:

答案 0 :(得分:0)

如果您可以使用io.js,则可以使用命令行-r--require预加载模块:

iojs -r <module_name> server.js

答案 1 :(得分:0)

我为前端创建了一个NPM模块,为Node.js / CommonJS做了另一个故事。

https://www.npmjs.com/package/requirejs-metagen

你可以像这样使用它:

var grm = require('requirejs-metagen'); //you can use with Gulp

var controllersOpts = {
        inputFolder: './public/static/app/js/controllers/all',
        appendThisToDependencies: 'app/js/controllers/',
        appendThisToReturnedItems: '',
        eliminateSharedFolder: true,
        output: './public/static/app/js/meta/allControllers.js'
    };


grm(controllersOpts,function(err){
  //handle errors your own way
});

它会生成相应的AMD / RequireJS模块,如下所示:

define(
    [
        "app/js/controllers/all/jobs",
        "app/js/controllers/all/users"
    ],
    function(){

        return {

            "jobs": arguments[0],
            "users": arguments[1]
        }
  });

您还可以要求子目录和所有类似的东西:

 var allViewsOpts = {
        inputFolder: './public/static/app/js/jsx',
        appendThisToDependencies: 'app/js/',
        appendThisToReturnedItems: '',
        eliminateSharedFolder: true,
        output: './public/static/app/js/meta/allViews.js'
    }

 grm(allViewsOpts );

生成如下输出:

define([
        "app/js/jsx/BaseView",
        "app/js/jsx/reactComponents/FluxCart",
        "app/js/jsx/reactComponents/FluxCartApp",
        "app/js/jsx/reactComponents/FluxProduct",
        "app/js/jsx/reactComponents/Item",
        "app/js/jsx/reactComponents/Job",
        "app/js/jsx/reactComponents/JobsList",
        "app/js/jsx/reactComponents/listView",
        "app/js/jsx/reactComponents/Picture",
        "app/js/jsx/reactComponents/PictureList",
        "app/js/jsx/reactComponents/RealTimeSearchView",
        "app/js/jsx/reactComponents/Service",
        "app/js/jsx/reactComponents/ServiceChooser",
        "app/js/jsx/reactComponents/todoList",
        "app/js/jsx/relViews/getAll/getAll",
        "app/js/jsx/relViews/jobs/jobsView",
        "app/js/jsx/standardViews/dashboardView",
        "app/js/jsx/standardViews/overviewView",
        "app/js/jsx/standardViews/pictureView",
        "app/js/jsx/standardViews/portalView",
        "app/js/jsx/standardViews/registeredUsersView",
        "app/js/jsx/standardViews/userProfileView"
    ],
    function(){

        return {

            "BaseView": arguments[0],
            "reactComponents/FluxCart": arguments[1],
            "reactComponents/FluxCartApp": arguments[2],
            "reactComponents/FluxProduct": arguments[3],
            "reactComponents/Item": arguments[4],
            "reactComponents/Job": arguments[5],
            "reactComponents/JobsList": arguments[6],
            "reactComponents/listView": arguments[7],
            "reactComponents/Picture": arguments[9],
            "reactComponents/PictureList": arguments[10],
            "reactComponents/RealTimeSearchView": arguments[11],
            "reactComponents/Service": arguments[12],
            "reactComponents/ServiceChooser": arguments[13],
            "relViews/getAll/getAll": arguments[14],
            "relViews/jobs/jobsView": arguments[15],
            "standardViews/dashboardView": arguments[16],
            "standardViews/overviewView": arguments[17],
            "standardViews/pictureView": arguments[18],
            "standardViews/portalView": arguments[19],
            "standardViews/registeredUsersView": arguments[20],
            "standardViews/userProfileView": arguments[21]
        }
  });

我需要更新库,以便它返回流,以便您可以在完成时进行处理,否则它会很好用。