我想用 Gulp 编译 JavaScript 文件.
I want to compile JavaScript files with Gulp.
我有一个 src 目录,其中所有脚本都带有 .js 扩展名.我希望将所有脚本单独编译并放置到与原始文件名相同的目标目录(dist)中.
I have a src directory where all scripts are present with .js extension. I want all scripts to be compiled separately and placed into a destination directory (dist) with the same filename as the original.
考虑这个例子:
src/jquery.js:
/**
* @require ../../vendor/jquery/dist/jquery.js
*/
src/application.js:
/**
* @require ../../vendor/angular/angular.js
* @require ../../vendor/ngprogress-lite/ngprogress-lite.js
* @require ../../vendor/restangular/dist/restangular.js
* @require ../../vendor/lodash/dist/lodash.underscore.js
* @require ../../vendor/angular-input-locker/dist/angular-input-locker.js
* @require ../../vendor/angular-route/angular-route.js
*/
(function(document, angular) {
'use strict';
var moduleName = 'waApp';
angular.module(moduleName, [
// Some more code here.
;
// Bootstrapping application when DOM is ready.
angular.element(document).ready(function() {
angular.bootstrap(document, [moduleName]);
});
})(document, angular);
我正在使用 gulp-resolve-dependencies 来解决在每个源 JavaScript 文件的标头.
I'm using gulp-resolve-dependencies to resolve dependencies specified in the header of each source JavaScript file.
我的 gulpfile.js 看起来像这样:
My gulpfile.js is looking like this:
//==============//
// Dependencies //
//==============//
var gulp = require('gulp');
var pathModule = require('path');
var resolveDependencies = require('gulp-resolve-dependencies');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
//=======//
// TASKS //
//=======//
gulp.task('build:scripts', function(callback) {
return gulp.src('scripts/*.js')
.pipe(resolveDependencies({
pattern: /* @require [s-]*(.*?.js)/g,
log: true
}))
.pipe(concat('all.js'))
.pipe(uglify())
.pipe(gulp.dest('js/'))
;
});
为了合并由 resolveDependencies 解析的脚本,我必须使用 concat,但 concat 需要一个文件名并且不仅合并原始文件和为它解析了依赖项,但所有 JavaScript 文件都是通过 glob 模式指定的.
In order to merge scripts resolved by resolveDependencies I have to use concat, but concat requires a filename and merges not only original file and dependencies resolved for it, but all JavaScript files specified via glob pattern.
那么,如何获取单个 JavaScript 文件作为输出? 像这样:
dist/jquery.js:
src/jquery.js
vendor/jquery.js
dist/application.js:
src/application.js
vendor/angular.js
vendor/ngprogress-lite.js
...
我现在有这个解决方法:
I have this workaround for now:
gulp.task('build:scripts', function(callback) {
var compileScript = function(stream, filename) {
return stream
.pipe(resolveDependencies({
pattern: /* @require [s-]*(.*?.js)/g,
log: true
}))
.pipe(concat(filename))
.pipe(uglify())
.pipe(gulp.dest('dist/'))
;
};
var scripts = getListOfFiles('src/', 'js');
for (key in scripts) {
var filename = scripts[key];
var stream = gulp.src(pathModule.join('src/', filename));
compileScript(stream, filename);
}
callback(null);
});
//===================//
// FUNCTIONS & UTILS //
//===================//
/**
* Returns list of files in the specified directory
* with the specified extension.
*
* @param {string} path
* @param {string} extension
* @returns {string[]}
*/
function getListOfFiles(path, extension) {
var list = [];
var files = fs.readdirSync(path);
var pattern = new RegExp('.' + extension + '$');
for (var key in files) {
var filename = files[key];
if (filename.match(pattern)) {
list.push(filename);
}
}
return list;
}
但它看起来很老套,我找不到一个很好的方法让它与 gulp-观看.
But it looks hackish and I can't find a good way to make it work with gulp-watch.
有没有更好更简单的方法来解决这个问题并达到预期的效果?
Is there a better and simpler way to solve this problem and achieve desired result?
如何获取单个 JavaScript 文件作为输出?
How do I get individual JavaScript files as the output?
在这里查看我对类似问题的回答:将随机值传递给 gulp 管道模板
Check an answer I gave to a similar problem here: Pass random value to gulp pipe template
使用这个 gulp 插件:https://github.com/adam-lynch/球形到乙烯基
Using this gulp plugin: https://github.com/adam-lynch/glob-to-vinyl
您可以访问单个文件.
这是怎么做的(假设使用这个插件):
This is how (assuming the use of this plugin):
function compileScript(file) {
gulp
.src('file')
.pipe(resolveDependencies({
pattern: /* @require [s-]*(.*?.js)/g,
log: true
}))
.pipe(concat())
.pipe(uglify())
.pipe(gulp.dest('dist/'))
;
};
gulp.task('build:scripts', function() {
globToVinyl('src/**/*.js', function(err, files){
for (var file in files) {
compileScript(files[file].path);
}
});
});
这篇关于使用 Gulp 编译 JavaScript 并解决依赖关系(单独的文件)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
Browserify,Babel 6,Gulp - 传播运算符上的意外令牌Browserify, Babel 6, Gulp - Unexpected token on spread operator(Browserify,Babel 6,Gulp - 传播运算符上的意外令牌)
是否可以将标志传递给 Gulp 以使其以不同的方式Is it possible to pass a flag to Gulp to have it run tasks in different ways?(是否可以将标志传递给 Gulp 以使其以不同的方式运行任务
为什么我们需要在全局和本地安装 gulp?Why do we need to install gulp globally and locally?(为什么我们需要在全局和本地安装 gulp?)
如何一个接一个地依次运行 Gulp 任务How to run Gulp tasks sequentially one after the other(如何一个接一个地依次运行 Gulp 任务)
打开 Javascript 文件时 Visual Studio 2015 崩溃Visual Studio 2015 crashes when opening Javascript files(打开 Javascript 文件时 Visual Studio 2015 崩溃)
检测 FLASH 插件崩溃Detect FLASH plugin crashes(检测 FLASH 插件崩溃)