【问题标题】:Sharing nunjucks filters across node and browser跨节点和浏览器共享 nunjucks 过滤器
【发布时间】:2014-10-10 19:05:21
【问题描述】:

我正在尝试找到一种方法让我的过滤器在两边都有效。

这是我在节点上的代码:

var env = nunjucks.configure(__dirname + '/../templates', {
    express: app
});

env.addFilter('date', function(str){
    return 'ok';
});

在浏览器端:

var env = new nunjucks.Environment();
env.addFilter('date', function(str){
    return 'ok';
});

我想将我的过滤器放在可以在这两种不同环境中使用的地方,但我没有找到解决方案。

在客户端,我使用的是 nunjucks-slim 版本。我的模板是使用 gulp 预编译的。

感谢您的帮助!

【问题讨论】:

  • 移动“env.addFilter(..);”代码到单独的文件和require(包括,粘贴,..)它两次?
  • 感谢您的回答@xmojmr。在节点方面,我是否需要一个文件向其传递参数(在我的情况下为 env)?在浏览器中,我应该使用 Browserify 之类的东西吗?
  • 是的,这样的事情可能是要走的路。你可以尝试谷歌搜索“site:stackoverflow.com browser side require”来找到相关的 Stack Overflow 文章(我最喜欢的是这篇 stackoverflow.com/questions/5168451/…)。我不知道nunjucks-slimgulp 能做什么,但你基本上只需要在构建期间将相同的代码sn-p 两次“粘贴”或“包含”到不同的源代码中

标签: javascript filter nunjucks


【解决方案1】:

您可以将过滤器放在单独的文件/模块中,在其中将 env 作为参数传入。

例如。

/**
* @param env The nunjucks environment
*/
function(env){
    env.addFilter('fancy', function(input){
        return 'fancy ' + input
    });

    env.addFilter(...);

    return env;
}

然后您可以使用 UMD 包装器 (https://github.com/umdjs/umd) 使其与浏览器和服务器兼容。完成的包装器可能看起来像这样:

// custom_filters.js
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], factory);
    } else if (typeof exports === 'object') {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.custom_filters = factory();
    }
}(this, function () {

    // Return a value to define the module export.
    return function(env){
        env.addFilter('fancy', function(input){
            return 'fancy ' + input
        });

        return env;
    };
}));

然后像这样使用它:

节点:

var env = nunjucks.configure(__dirname + '/../templates', {
    express: app
});
require('./path/to/custom_filters')(env);

浏览器(全局):

var env = new nunjucks.Environment();
window.custom_filters(env);

浏览器 (AMD):

define(
    ['nunjucks', 'path/to/custom_filters'],
    function(nunjucks, custom_filters){
        var env = new nunjucks.Environment();
        return custom_filters(env);
    }
);

【讨论】:

  • 非常感谢您花时间举个例子:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2016-09-09
  • 2015-01-25
  • 2014-01-27
  • 2019-09-13
  • 2021-01-02
相关资源
最近更新 更多