节点assetmanager包含更多模块

时间:2014-04-25 13:03:06

标签: node.js

我正在尝试设置资产管理员 我的博客有三个模块

  • 默认
  • 登录
  • 管理员

我试过

assets.json

{
    "css": {
            "app":{
                "public/src/dist/default/css/dist.min.css": [
                    "public/src/assets/default/css/*.css"
                ]
            },
            "login":{
                "public/src/dist/login/css/dist.min.css": [
                    "public/src/assets/default/css/*.css"
                ]
            },
             "admin":{
                "public/src/dist/admin/css/dist.min.css": [
                    "public/src/assets/admin/css/*.css"
                ]
            }
        }
}

express.js

assetmanager.init({
    js: assets.js,
    css: assets.css,
    debug: (process.env.NODE_ENV !== 'production'),
    webroot: 'public'
});
// Add assets to local variables
app.use(function(req, res, next) {
    res.locals({
        assets: assetmanager.assets
    });
    next();
});
console.log(assetmanager.assets);

但是console.log(assetmanager.assets); 给我一个空数组[]

有没有办法管理资产管理员 有多个模块?

我发现的最好方式 就像我的控制器一样:

'use strict';
var assetmanager = require('assetmanager');
exports.render = function(config) {
    var assets = require(config.sroot+'/config/assets.json');
    assetmanager.init({
        js: assets.js.app,
        css: assets.css.app,
        debug: (process.env.NODE_ENV !== 'production'),
        webroot: 'public'
    });
    return function(req, res) {
        res.render('layouts/default', {appTitle:'ilwebdifabio',assets:assetmanager.assets});
    }
};

但它很丑陋而且我有 重复代码:(

结束

无法使用assetmanager模块 在不同的模块(登录,默认,管理员)。 第一次加载时,Node.js应用程序会自动缓存模块。因此,重复调用require() - 加载模块的全局方法 - 将导致对同一个缓存对象的引用。 所以你最终,即如果你在一个模块中使用 所以在所有其他模块中都有专属资产 我用以下方法解决了这个问题:

'use strict';

var  _ = require('lodash');

module.exports = function (path,route) {
    var env = (process.env.NODE_ENV === 'production') ? 'production' : null;

    var debug = (env !== 'production');

    var data = require(path+'/config/assets.json');

    var assets = {
        css: [],
        js: []
    };

    var getAssets = function (pattern) {
        var files = [];
        if (_.isArray(pattern)) {
            _.each(pattern, function (path) {
                files = files.concat(getAssets(path));
            });
        } else if (_.isString(pattern)) {
            var regex = new RegExp('^(//)');
            if (regex.test(pattern)) {
                // Source is external
                //For the / in the template against 404
                files.push(pattern.substring(1));
            } else {
                files.push(pattern);
            }
        }
        return files;
    };

    var getFiles = function () {
        var current = data[route];
        _.each(['css', 'js'], function (fileType) {
            _.each(current[fileType], function (value, key) {
                if (!debug) {
                    assets[fileType].push(key);
                } else {
                    assets[fileType] = assets[fileType].concat(getAssets(value));
                }
            });
        });
    };

    var getCurrentAssets = function(){
        return assets;
    };

    getFiles();

    return {
        getCurrentAssets: getCurrentAssets
    };
};
控制器中的

var assetmanager = require(config.sroot+'/utils/assetsmanager')(config.sroot,'app');
        res.render('layouts/default', {
            assets:assetmanager.getCurrentAssets()
        });

1 个答案:

答案 0 :(得分:1)

有一个新版本的assetmanager 1.0.0,我相信它可以更有效地完成你想要做的事情。在新版本中,您可以将资产拆分为多个组,以便支持多个布局。 github有一个完整的例子here,但基本上你的资产文件最终看起来像这样:

{
    "main": {
        "css": {
            "public/build/css/main.min.css": [
                "public/lib/bootstrap/dist/css/bootstrap.css",
                "public/css/**/*.css"
            ]
        },
        "js": {
            "public/build/js/main.min.js": [
                "public/lib/angular/angular.js",
                "public/js/**/*.js"
            ]
        }
    },
    "secondary": {
        "css": {
            "public/build/css/secondary.min.css": [
                "public/css/**/*.css"
            ]
        },
        "js": {
            "public/build/js/secondary.min.js": [
                "public/js/**/*.js"
            ]
        }
    }
}

然后在您的布局中,您只需添加所需的组。希望这会有所帮助。