受以前的文章启发,我制作了一份Rakefile和WysiHat(由changelog提及的RTE)分发的供应商目录的副本,并进行了一些修改,包括使用JSLint进行代码检查和使用YUI Compressor进行缩小。
这个想法是使用Sprockets(来自WysiHat)将多个JavaScript合并到一个文件中,使用JSLint检查合并文件的语法,并在分发之前使用YUI Compressor对其进行最小化。
先决条件
现在做
- 下载Rhino并将JAR(“ js.jar”)放入您的类路径中
- 下载YUI Compressor并将JAR(build / yuicompressor-xyz.jar)放到您的类路径中
- 下载WysiHat并将“供应商”目录复制到您的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
};
我不是模仿的忠实拥护者,但是如果您有许多想要移出全局范围的对象,这可能会有所帮助。