我有一个使用名为MyApp
的Gem的Rails 4.1应用程序shared-assets
。这个Gem使用bundle gem foo
进行初始化,以创建一个非常准确的Ruby Gem,它将包含任何Rails应用程序可以重用的资源(样式表,JavaScript和视图)。
MyApp
还使用 CommonJS 来更好地封装代码并定义依赖关系。 MyApp
有一个中介文件(assets/javascripts/mediator/registration-page.module.js.coffee
),它试图要求shared-assets
Gem中存在一个JavaScript模块。模块JS文件已添加到application.js
管道中,但在页面加载时会引发JavaScript错误:Uncaught ReferenceError: module is not defined
。
检查页面上的源JavaScript文件我可以看到MyApp
内的中介设置正确:
MyApp -->
mediator / registration-page.module.js.coffee
this.require.define({"mediator/registration-page":function(exports, require, module){(function() {
var Checkbox, initialize, test;
// Module that exists within the `shared-assets` Gem
Checkbox = require('./shared-assets/modules/checkbox');
test = function() {
return 'success';
};
initialize = function() {
return console.log('registration init');
};
module.exports = {
init: initialize,
test: test
};
}).call(this);
;}});
shared-assets
Gem中存在的Checkbox模块不会像MyApp
中的JS文件那样进行设置。相反,它只是编译为经典的Coffee
到JS
。
shared-assets -->
modules / checkbox.module.js.coffee
(function() {
var Selector, checkboxButtonClicked, checkboxToggle;
Selector = {
checkboxContainer: '.check-option'
};
checkboxButtonClicked = function(e) {
console.log('Checkbox has been clicked');
return false;
};
module.exports = {
clicked: checkboxButtonClicked
};
}).call(this);
所以这里没有定义module
,因为我假设它没有以正常的 CommonJS 格式设置,因为registration-page.module.js.coffee
被编译为。
我要求MyApp
Gemfile中的 CommonJS 和application.js
。我还在runtime_dependency
Gemspec中为 CommonJS 添加了shared-assets
。
MyApp Gemfile
...
gem 'sprockets-commonjs', '~> 0.0.6'
...
共享资产Gemspec
Gem::Specification.new do |spec|
...
spec.add_runtime_dependency "sprockets-commonjs", "~> 0.0.6"
...
end
MyApp application.js
//= require jquery
//= require sprockets/commonjs.js
//= require shared-assets/modules/checkbox.module
//= require mediator/registration-page.module
这甚至可以设置吗?使用Gem作为可与CommonJS一起使用的JavaScript模块的“共享资源”?如果是这样,我在这里做错了什么? Gem是否需要设置为Rails Gem而不是纯手宝石?
任何反馈或帮助都在这里受到赞赏!
因此,在尝试调查为什么这不起作用时,我将checkbox.module.js.coffee
位于CommonJS包装器内的shared-assets
Gem中。这样做修复了JS错误,但由于导出的方法在模块中不可用,导致更加混乱。我能够毫无问题地要求它,但没有出口。