如何在Geails中使用需要JS模块资产的Rails App上的CommonJS?

时间:2017-02-27 18:21:22

标签: ruby-on-rails ruby rubygems commonjs

我有一个使用名为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文件那样进行设置。相反,它只是编译为经典的CoffeeJS

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错误,但由于导出的方法在模块中不可用,导致更加混乱。我能够毫无问题地要求它,但没有出口。

0 个答案:

没有答案