フォルダ構造を保持しながら複数のスクリプトファイルをgrunt-uplifyする方法
-
21-12-2019 - |
質問
私は、Ugrifiedファイルを含むフォルダ構造をそのまま含めながら、複数のフォルダを超える複数のスクリプトファイルをgrunt-uplifyするための良い方法を見つけていません。 私がやりたい唯一の理由は、私が取り組んでいるWebページの「レガシー」部分のパフォーマンスを向上させることができることです。
私はこれをやりたくないような方法を見つけました、それは多くの時間にかかるので、そしてこの答えのようにそれをすることです(彼らはそれぞれのSRCとDestペアを別々に指定されています)。 ファイルを切り捨てるためのconfig grunt.jsを別々に
私が達成したいものの例:
**src dir (no uglify applied):**
src
|- app1
|- randomFile.js
|- scripts
|- file1.js
|- file2.js
|- libs
|- file3.js
|- file4.js
|- app2
|- scripts
|- file1.js
|- file2.js
**destination dir (uglify applied, same file name):**
dist
|- app1
|- randomFile.js
|- scripts
|- file1.js
|- file2.js
|- libs
|- file3.js
|- file4.js
|- app2
|- scripts
|- file1.js
|- file2.js
.
BTWは可能な場合はCSSファイルに対して同じことをしたいです。
これが可能かどうか知っていますか?
解決
Rafa Heringer
の答えの原則にリンクした投稿は有望な、ちょっとしたねじれ:
uglify: {
min: {
files: grunt.file.expandMapping(['path/**/*.js', 'path2/**/*.js'], 'destination/', {
rename: function(destBase, destPath) {
return destBase+destPath.replace('.js', '.min.js');
}
})
}
}
.
ここでの唯一の違いは、ベースパスとその拡張子付きのワイルドカードファイル名の間の二重アスタリスクです。それはすべてのサブフォルダを通過し、そしてうまくいけば - 出力それぞれがその正当なフォルダに見つかることがあります。
出力は次のようになります。
path/test.js => destination/path/test.min.js
path/subpath1/abc.js => destination/path/subpath1/abc.min.js
path/subpath2/yey.js => destination/path/subpath2/yey.min.js
path2/foo.js => destination/path2/foo.min.js
.
CSS
( grunt-conto-cssmin プラグイン)、上記のアプローチはまだ機能しますが、あなたが望む方法で除算されたCSS
を出力するために適切になる必要がある関連するプラグイン構成と組み合わせる必要があるでしょう。
PS:を自分で走らせていない!
他のヒント
@Dionnisによる答えと同様ですが、同じフォルダ:
に分類されたファイルを保存します。 uglify: {
all: {
files: [{
expand: true,
cwd: 'path/to/js/',
src: ['*.js', '!*.min.js'],
dest: 'path/to/js/',
ext: '.min.js'
}]
}
}
. 実際には、次の方法を使用できます。
uglify: {
all: {
files: [{
expand: true,
cwd: 'js/',
src: ['*.js', '**/*.js'],
dest: 'js-min/',
ext: '.min.js',
}],
},
}
. wallaceからの答えは素晴らしいですが、あなたがミニフィルしようとしているファイルがGruntの開始前に存在しない場合(つまり、別のタスクに依存している場合)、タスクの前にマップが生成されるため、機能しません。実行されます。
Grunt-Contrif-Ugrifyの代わりに、ノードパッケージUglify-JSを使用して、生成ファイルを個別に分類するためのソリューションを思い出しました。
- あなたのpackage.json にuglify-jsを追加
- 次の例のいずれかの例をgrunfileに追加します(ここでは「ファイル」を "あなたのファイル"を適切なglobに置き換えます)。
- 除算されたファイルの宛先または拡張子を変更する必要がある場合は、代わりに例2を使用してください。それはgrant.file.recurseを使用しています。これは、各ファイルのルートディレクトリ、サブディレクトリ、およびファイル名を提供するコールバックで(カスタム宛先パスを構築するのが簡単です)。スキャンしたいディレクトリで「フォルダ」を置き換えて、独自の「カスタムパス」を作成します。
例1: Grant.File.expand
grunt.registerTask('uglifyFiles', 'Uglifies files', function () {
var jsp = require("uglify-js").parser,
pro = require("uglify-js").uglify,
count = 0;
grunt.file.expand(['YOUR FILES HERE']).forEach(function (abspath) {
// Exclude already minified files (with extension .min.js)
if (!abspath.match(/\.min\.js$/i)) {
// Get Abstract Syntax Tree
var ast = jsp.parse(grunt.file.read(abspath));
// If mangling
// ast = pro.ast_mangle(ast);
// If squeezing
ast = pro.ast_squeeze(ast);
// Write new file
grunt.file.write(abspath.replace(/\.js$/i, '.min.js'), pro.gen_code(ast));
count += 1;
}
});
grunt.log.oklns("Successfully uglified " + count + " files");
});
.
例2: grant.file.recurse
grunt.registerTask('uglifyFiles', 'Uglifies files', function () {
var jsp = require("uglify-js").parser,
pro = require("uglify-js").uglify,
count = 0;
grunt.file.recurse('FOLDER', function callback(abspath, rootdir, subdir, filename) {
// Exclude already minified files (with extension .min.js)
if (!abspath.match(/\.min\.js$/i)) {
// Get Abstract Syntax Tree
var ast = jsp.parse(grunt.file.read(abspath));
// If mangling
// ast = pro.ast_mangle(ast);
// If squeezing
ast = pro.ast_squeeze(ast);
// Write new file, using abspath or rootdir, subdir and filename
grunt.file.write('CUSTOM PATH HERE', pro.gen_code(ast));
count += 1;
}
});
grunt.log.oklns("Successfully uglified " + count + " files");
});
. このソリューション私のために機能しない。
これは実施例:
path: {
build: {
src: 'assets',
js: 'js',
css: 'css'
},
js: 'js',
css: 'css'
},
uglify: {
scripts: {
expand: true,
cwd: '<%= path.js %>/',
src: [
'**/*.js',
'*.js',
//skip minified scripts
'**/!*.min.js',
'!*.min.js'
],
dest: '<%= path.build.src %>/<%= path.build.js %>/',
rename: function (destBase, destPath) {
return destBase + destPath.replace('.js', '.min.js');
}
}
},
//same options for css minify
cssmin: {
styles: {
expand: true,
cwd: '<%= path.css %>/',
src: [
'**/*.css',
'*.css',
//skip minified styles
'**/!*.min.css',
'!*.min.css'
],
dest: '<%= path.build.src %>/<%= path.build.css %>/',
rename: function (destBase, destPath) {
return destBase + destPath.replace('.css', '.min.css');
}
}
},
//and watch it for changes
watch: {
js: {
files: [
'<%= path.js %>/*.js',
'<%= path.js %>/**/*.js'
],
tasks: [
'uglify:scripts'
],
options: {
livereload: true
}
},
css: {
files: [
'<%= path.css %>/*.css',
'<%= path.css %>/**/*.css'
],
tasks: [
'cssmin:styles'
],
options: {
livereload: true
}
}
}
.
- Grunt 0.4.1
- GRUNT-CONTRY-UGLIFY 0.9.1
- Grunt-Contrib - CSSmin 0.12.2
- grunt-contrib-watch 0.6.1