Handlebars.js 组装/把手:运行外部js文件中定义的自定义函数

Handlebars.js 组装/把手:运行外部js文件中定义的自定义函数,handlebars.js,assemble,Handlebars.js,Assemble,假设我有这个javascript文件 src/js/functions.js (function() { crc32 = function(str, crc ) { ... }; })(); <script type="text/javascript" charset="utf-8"> var crc_checksum = {{checksum solution}}; </script> Handlebars.registerH

假设我有这个javascript文件

src/js/functions.js

(function() { 

    crc32 = function(str, crc ) { 
    ...
    }; 
})();
<script type="text/javascript" charset="utf-8">
    var crc_checksum = {{checksum solution}};
</script>
Handlebars.registerHelper('checksum', function(value){
    this.checksum = return value;
});    
(function(exports) {
  exports.crc32 = function (str, crc) { ... };
})(window || module.exports);
var crc32 = require('./src/js/functions').crc32;
Handlebars.registerHelper('checksum', function (value) {
  return crc32(value);
});
此文件是静态网站的一部分,我想在模板中使用crc32(),如下所示:

指数.hbs

(function() { 

    crc32 = function(str, crc ) { 
    ...
    }; 
})();
<script type="text/javascript" charset="utf-8">
    var crc_checksum = {{checksum solution}};
</script>
Handlebars.registerHelper('checksum', function(value){
    this.checksum = return value;
});    
(function(exports) {
  exports.crc32 = function (str, crc) { ... };
})(window || module.exports);
var crc32 = require('./src/js/functions').crc32;
Handlebars.registerHelper('checksum', function (value) {
  return crc32(value);
});

我不想将crc32代码复制粘贴到帮助程序中(因为这会复制代码)。有没有办法将外部JS文件加载到助手的命名空间中?

您可以以“node.JS”的方式构建
crc32
文件,并在站点中使用它。还有其他方法可以使
crc32
对象在节点和浏览器上都可用。然后,您可以在助手文件中
要求

src/js/functions.js

(function() { 

    crc32 = function(str, crc ) { 
    ...
    }; 
})();
<script type="text/javascript" charset="utf-8">
    var crc_checksum = {{checksum solution}};
</script>
Handlebars.registerHelper('checksum', function(value){
    this.checksum = return value;
});    
(function(exports) {
  exports.crc32 = function (str, crc) { ... };
})(window || module.exports);
var crc32 = require('./src/js/functions').crc32;
Handlebars.registerHelper('checksum', function (value) {
  return crc32(value);
});
helpers.js

(function() { 

    crc32 = function(str, crc ) { 
    ...
    }; 
})();
<script type="text/javascript" charset="utf-8">
    var crc_checksum = {{checksum solution}};
</script>
Handlebars.registerHelper('checksum', function(value){
    this.checksum = return value;
});    
(function(exports) {
  exports.crc32 = function (str, crc) { ... };
})(window || module.exports);
var crc32 = require('./src/js/functions').crc32;
Handlebars.registerHelper('checksum', function (value) {
  return crc32(value);
});

当然,在创建帮助程序时,只需遵循与任何其他节点库相同的模块模式即可

将助手包装在
模块中。导出。注册
函数:

module.exports.register = function (Handlebars, options, params) {
  Handlebars.registerHelper('checksum', function(src) {
    return require('your-checksum-lib')(src);
  });
};
然后确保告诉Assembly文件的位置:

assemble: {
  options: {
    helpers: ['path/to/checksum.js']
  }
}
或者。。。如果助手实际上是npm模块本身,则可以将其添加到package.json中的
devDependencies
关键字
,Assembly将自动拾取它。e、 g:

{
  "name": "foo",
  "devDependencies": {
    "handlebars-helper-checksum": "~0.1.0",
  },
  "keywords": [
    "handlebars-helper-checksum"
  ]
}

但是,您也可以在repo上对该助手进行请求或pr,我们可以将其添加到库中

那正是我想要的,谢谢。我没有使用browserify(可能是另一个依赖项),而是在节点和浏览器之间共享代码。谢谢Jon。由于该模块不是npm模块,我最终使用了require和js文件的相对路径,并添加了一些代码,使其可用于browser和node.js。通过
options.helpers告诉assemble有什么好处吗?@PhilippKeller如果在
/src/helpers/
这样的文件夹中有多个helper文件,您可以告诉assemble通过
options.helpers
加载它们。在这些帮助程序中,您可以对其他模块执行
require
<代码>汇编:{options:{helpers:['./src/helpers/***.js']}
是的,正如@doowb所指出的,您可以使用minimatch/glob模式一次加载所有的助手。下面是一个示例项目,演示了我们所描述的内容: