JavaScript Sea.js 项目中的模块化定义能否有简便方法提取成 JavaScript 的封装函数或者类

xiaoxiao · 2017年02月13日 · 最后由 xiaoxiao 回复于 2017年02月14日 · 6290 次阅读

公司遗留了个 seajs 的项目,我看了下 js 都是用 seajs 模块化编写的,例如

drag.js
define(function (require, exports, module) {
  "require:nomunge,exports:nomunge,module:nomunge";
  var var1
  Drag.prototype = {
    ...
    }
    return Drag
})
dialog.js
define(function (require, exports, module) {
    "require:nomunge,exports:nomunge,module:nomunge";
    var Drag = require('./drag');
    var var1, var2;
    Dialog.prototype = {
    ...
    }
    return Dialog
})

由于对 seajs 不熟悉,并且我看了下这种前端的开发模式会和 rails 项目在生产模式下 Asset Pipeline 冲突,请教下各位高手,能否将这些用 seajs 写的模块化 js 提取成原生的 js 函数类或者对象,如果我直接把 define 里面的内容不加修改的提取出来,肯定会遇到很多局部变量的重复命名冲突的,我的想法是能否用 js 的闭包或者其他什么方法,把原来的 seajs 的每一个 module 封装成类或者对象,用 return 来替换原先的 module.exports 的作用,例如我下面写的伪代码

drag.js
var drag=function(){
    Drag.prototype = {
    ...
    }
    return Drag
}
dialog.js
var dialog=function(){
    Dailog.prototype = {
    ...
    }
    return Dailog
}

请教下论坛里的 javascript 的前端高手,能否给个解决方案或者例子。

不可以的,你这么做是开历史的倒车。依靠 global objects namespace, 别的不说,光是加载顺序依赖就够恶心的了。

seajs 没接触过,不知道这个模块定义是不是 require.js 或者照规范来的。如果是,可以直接用 require.js,如果不是可以考虑略作修改用 require.js 或者 CommonJS 系统。

#1 楼 @billy 我找到了一个 gem 叫 seajs-rails 的 gem 也是处理这个问题的,seajs 本身就是前端框架,能独立后端运行,但是对于我这样的后端 ruby 开发人员就不友好了,我想封装的原意是能简化 js 的管理,将 js 的模块插件化,只用 rails 自带的 application.js 中的 require 模式加载 js 库,这样在生产环境只需要 rake assets:precompile 一下就好了。

CoffeeScript 默认用闭包包裹,assets pipeline require 可以处理依赖。

重构吧,GitHub 上面项目看起来都已经很久没提交了。

@huacnlee @Rei 恩,谢谢,我会考虑下各位的建议的

xiaoxiao 关闭了讨论 02月14日 14:15
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册