这是一个相当久远的问题,但我有一个对我有效并且应该适用于其他人的解决方案。
首先,我们必须了解 wiredep 的工作原理。它不像我之前想象的那样明显,因为 wiredep 默认情况下在您要注入的文件上进行操作。典型的实现方式如下:
var wiredep = require('wiredep').stream;
gulp.task('bower', function () {
gulp.src('./src/footer.html')
.pipe(wiredep({
ignorePath: '../'
}))
.pipe(gulp.dest('./dest'));
});
看一下require部分,其中将stream函数分配给一个wiredep变量。从此时起,你仅使用stream函数,实际上它并不返回一个由bower组件构成的流,正如你所想的那样。现在wiredep操作通过管道传递的文件,在上面的例子中是footer.html,管道的输出仍然是footer.html但是被wiredep修改了。这就是为什么最终得到的all.js包含index.cshtml的管道链:
bower_components
|
V
"src/footer.html" ===> wiredep.stream() ===> gulp.dest() ===> "dest/footer.html"
现在我们需要问两个问题:如何获取wiredep使用的文件列表,以及如何使用它们。幸运的是,这些问题都有答案。
如何获取文件列表
这是一个相当简单的任务。首先,修改require函数调用以包括整个库:var wiredep = require('wiredep');
。从此,您可以使用wiredep提供的两个附加字段:wiredep().js
- 从bower_components中获取JS文件,wiredep().css
- 从bower_components获取CSS文件。
如何使用它们
为完成此任务,我使用了gulp-inject,它非常适合这种工作,当然还有gulp-concat。如果您没有它们,只需通过NPM安装它们(npm install --save-dev gulp-inject gulp-concat
),并将其添加为gulpfile的依赖项即可。
如果您要使用的index.html示例如下:
<html>
<head>
<title>Hello World!</title>
</head>
<body>
Hello World!
</body>
</html>
你的gulpfile会长成这个样子:
var gulp = require('gulp');
var inject = require('gulp-inject');
var concat = require('gulp-concat');
var wiredep = require('wiredep');
gulp.task('bower', injectBower);
function injectBower() {
var target = gulp.src('./html/index.html');
var js = gulp.src(wiredep().js);
var css = gulp.src(wiredep().css);
return target
.pipe(inject(js.pipe(concat('bower.js')).pipe(gulp.dest('./scripts'))))
.pipe(inject(css.pipe(concat('bower.css')).pipe(gulp.dest('./styles'))))
.pipe(gulp.dest('./html'));
}
现在,在您运行 gulp bower
后,您的 index.html 应该如下所示:
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="styles/bower.css"/>
</head>
<body>
Hello World!
<script src="scripts/bower.js"></script>
</body>
</html>
Gulp将在scripts
目录中创建合并后的JS文件,在styles
目录中创建合并后的CSS文件。您可以自由地定制此过程;有关更多信息,请访问gulp-inject页面。gulp-inject是非常灵活的工具,因此您应该能够达到预期的结果。在我的情况下,在构建生产环境时还附加了gulp-uglify和gulp-rev。
如果您有任何问题,请随时提出。
all.js
文件? - toddmo