受早期帖子的启发,我制作了一份随WysiHat(变更日志中提到的 RTE)分发的Rakefile和供应商目录的副本,并进行了一些修改,包括使用JSLint 进行代码检查和使用YUI Compressor进行缩小。
这个想法是使用链轮(来自 WysiHat)将多个 JavaScript 合并到一个文件中,使用 JSLint 检查合并文件的语法,并在分发前使用 YUI Compressor 将其缩小。
先决条件
现在做
- 下载Rhino并将 JAR ("js.jar") 放到你的类路径中
- 下载YUI Compressor并将 JAR (build/yuicompressor-xyz.jar) 放到你的类路径中
- 下载WysiHat并将“vendor”目录复制到 JavaScript 项目的根目录
- 下载Rhino 的 JSLint并将其放在“vendor”目录中
现在在 JavaScript 项目的根目录中创建一个名为“Rakefile”的文件,并在其中添加以下内容:
require 'rake'
ROOT = File.expand_path(File.dirname(__FILE__))
OUTPUT_MERGED = "final.js"
OUTPUT_MINIFIED = "final.min.js"
task :default => :check
desc "Merges the JavaScript sources."
task :merge do
require File.join(ROOT, "vendor", "sprockets")
environment = Sprockets::Environment.new(".")
preprocessor = Sprockets::Preprocessor.new(environment)
%w(main.js).each do |filename|
pathname = environment.find(filename)
preprocessor.require(pathname.source_file)
end
output = preprocessor.output_file
File.open(File.join(ROOT, OUTPUT_MERGED), 'w') { |f| f.write(output) }
end
desc "Check the JavaScript source with JSLint."
task :check => [:merge] do
jslint_path = File.join(ROOT, "vendor", "jslint.js")
sh 'java', 'org.mozilla.javascript.tools.shell.Main',
jslint_path, OUTPUT_MERGED
end
desc "Minifies the JavaScript source."
task :minify => [:merge] do
sh 'java', 'com.yahoo.platform.yui.compressor.Bootstrap', '-v',
OUTPUT_MERGED, '-o', OUTPUT_MINIFIED
end
如果您正确完成所有操作,您应该能够在控制台中使用以下命令:
rake merge
-- 将不同的 JavaScript 文件合并为一个
rake check
-- 检查代码的语法(这是默认任务,因此您只需键入rake
)
rake minify
-- 准备 JS 代码的缩小版本
关于源合并
使用 Sprockets,您可以包含(或require
)其他 JavaScript 文件的 JavaScript 预处理器。使用以下语法从初始文件(名为“main.js”,但您可以在 Rakefile 中更改它)中包含其他脚本:
(function() {
//= require "subdir/jsfile.js"
//= require "anotherfile.js"
// some code that depends on included files
// note that all included files can be in the same private scope
})();
接着...
看看随 WysiHat 提供的 Rakefile 来设置自动化单元测试。好东西 :)
现在来看看答案
这并不能很好地回答原始问题。我知道,对此我深表歉意,但我已将其张贴在这里,因为我希望它对其他人整理他们的烂摊子有用。
我解决这个问题的方法是尽可能多地进行面向对象的建模,并将实现分离到不同的文件中。然后处理程序应该尽可能短。List
单例的例子也很好。
和命名空间......好吧,它们可以被更深的对象结构模仿。
if (typeof org === 'undefined') {
var org = {};
}
if (!org.hasOwnProperty('example')) {
org.example = {};
}
org.example.AnotherObject = function () {
// constructor body
};
我不是模仿的忠实粉丝,但是如果您有许多想要移出全局范围的对象,这可能会有所帮助。