受之前帖子的启发,我制作了一个Rakefile和供应商目录的副本,并与WysiHat (changelog提到的RTE)一起分发,并进行了一些修改,包括使用JSLint进行代码检查和使用YUI Compressor进行缩小。
这个想法是使用Sprockets(来自WysiHat)将多个JavaScripts合并到一个文件中,在发布之前用JSLint检查合并文件的语法,并用YUI Compressor缩小它。
先决条件
Java运行时
红宝石和耙子宝石
您应该知道如何将JAR放入Classpath
现在做的
下载Rhino并将JAR(“js.jar”)放到类路径中
下载YUI Compressor并将JAR (build/yuicompressor-xyz.jar)放到类路径中
下载WysiHat并将“vendor”目录复制到你的JavaScript项目的根目录
下载JSLint for Rhino,并将其放到“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检查——检查代码的语法(这是默认任务,因此只需输入Rake)
rake minify——准备JS代码的缩小版本
关于源合并
使用Sprockets, 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 singleton的例子也是一个很好的例子。
和名称空间……它们可以被更深层次的物体结构所模仿。
if (typeof org === 'undefined') {
var org = {};
}
if (!org.hasOwnProperty('example')) {
org.example = {};
}
org.example.AnotherObject = function () {
// constructor body
};
我不太喜欢模仿,但是如果您有很多想要移出全局作用域的对象,这可能会很有帮助。