以前の投稿に触発されて、 WysiHat (changelog で言及されている RTE) で配布されているRakefileとベンダーディレクトリのコピーを作成し、 JSLintによるコード チェックとYUI Compressorによる縮小を含むようにいくつかの変更を加えました。
Sprockets (WysiHat から) を使用して複数の JavaScript を 1 つのファイルにマージし、マージされたファイルの構文を JSLint でチェックし、配布前に YUI Compressor で縮小するという考え方です。
前提条件
- Java ランタイム
- ルビーとレーキの宝石
- JARをクラスパスに入れる方法を知っておく必要があります
今やります
- 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 ファイルを 1 つにマージするには
rake check
-- コードの構文をチェックします (これはデフォルトのタスクなので、単純に入力できますrake
) 。
rake minify
-- JS コードの縮小版を準備する
ソースのマージについて
require
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
もいい例です。
そして名前空間...まあ、それらはより深いオブジェクト構造によって模倣できます。
if (typeof org === 'undefined') {
var org = {};
}
if (!org.hasOwnProperty('example')) {
org.example = {};
}
org.example.AnotherObject = function () {
// constructor body
};
私はイミテーションの大ファンではありませんが、グローバル スコープから移動したいオブジェクトが多数ある場合に役立ちます。