带有 grunt 的 Concat bower 组件

Posted

技术标签:

【中文标题】带有 grunt 的 Concat bower 组件【英文标题】:Concat bower components with grunt 【发布时间】:2014-02-04 13:10:22 【问题描述】:

我正在构建一个需要少量前端库/框架的应用程序,例如:

jQuery JQueryUI AngularJS 基础

我正在使用bower 下载组件。此时我的 html 看起来像:

<script src="components/jquery/jquery.js"></script>
<script src="components/angular/angular.js"></script>
<script src="components/etc/etc.js"></script>

我的目标是制作一个grunt 脚本,它会自动获取已安装的组件,连接并缩小它们并将它们输出为lib.js

问题:

通过我所有的研究,我想出了如何连接目录中的所有文件。 我的目标是获取 bower 组件并将它们连接起来,而不是在 gruntfile 中一一列出。我该如何存档?

是否可以只使用我想要的模块而不是拥有整个 UI 来构建自定义 jQuery UI。

谢谢。

【问题讨论】:

【参考方案1】:

usemin 是你的朋友。

安装 usemin、复制、concat 和 uglify:

npm install --save-dev grunt-usemin
npm install --save-dev grunt-contrib-copy
npm install --save-dev grunt-contrib-concat
npm install --save-dev grunt-contrib-uglify

在您的 HTML 文件中设置构建块:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>usemin</title>
  <!-- build:js lib.js -->
    <script src="components/jquery/jquery.js"></script>
    <script src="components/angular/angular.js"></script>
    <script src="components/etc/etc.js"></script>
  <!-- endbuild -->
</head>
<body>
<h1>usemin</h1>
</body>
</html>

设置您的 Gruntfile:

module.exports = function(grunt) 
  grunt.initConfig(
    pkg: grunt.file.readJSON('package.json'),

    copy: 
      dist: 
        files: [ src: 'index.html', dest: 'dist/index.html' ]
      
    ,

    'useminPrepare': 
      options: 
        dest: 'dist'
      ,
      html: 'index.html'
    ,

    usemin: 
      html: ['dist/index.html']
    
  );

  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-usemin');

  grunt.registerTask('default', ['useminPrepare', 'copy', 'concat', 'uglify', 'usemin']);
;

咕噜声

grunt

结果:

├── Gruntfile.js
├── components
│   ├── angular
│   │   └── angular.js
│   ├── etc
│   │   └── etc.js
│   └── jquery
│       └── jquery.js
├── dist
│   ├── index.html
│   └── lib.js
├── index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>usemin</title>
  <script src="lib.js"></script>
</head>
<body>
<h1>usemin</h1>
</body>
</html>

【讨论】:

很好的答案。我已经找了一段时间了! @steveax 我注意到concatuglify 已加载/注册,但未配置。我的印象是所有任务都必须配置,所以您是否不小心忽略了它们的配置,或者是为了缩短答案,或者因为它们不是必需的? @travelampel 它们不是必需的,useminPrepare 生成配置。阅读useminPrepare section。 @steveax - 很抱歉恢复旧的回复,但我还有一个问题。在按照您的说明/代码进行操作后,我现在是否应该更改我的 Expressjs server.js 文件中的设置,以便在推送到 Heroku 之前从 dist 文件夹中提供文件?我还用 dist 文件夹推送我的 app 文件夹吗?提前致谢。 usemin 尚未维护。还有其他解决方案吗?【参考方案2】:

“我的目标是获取 bower 组件并将它们连接起来,而不是在 gruntfile 中一一列出”

您可以从依赖项目录和子目录中获取所有 javascript 文件,并以这种方式将它们连接起来:

grunt.config('concat.mydeps', 
  files: [
    src: ['components/**/*.js'],
    dest: 'dist/lib.js'
  ]
)

...但是如果脚本执行的顺序很重要,这就是灾难的根源:-)。

此外,这些文件夹很可能包含缩小版和非缩小版,导致您包含一些脚本两次...

避免这种副作用的方法是:

grunt.config('concat.mydeps', 
  files: [
    src: ['components/**/*.js', '!components/**/*min.js'],
    dest: 'dist/lib.js'
  ]
)

...但同样,这当然不是万无一失的——给定的组件很可能有一个构建版本,以及一个拆分的源代码。

恕我直言,唯一明智的出路是按照您需要的顺序明确列出您想要聚合的文件(就像您现在在 html 中所做的那样)。

【讨论】:

或者使用类似 npm module grunt-bower-concat

以上是关于带有 grunt 的 Concat bower 组件的主要内容,如果未能解决你的问题,请参考以下文章

grunt学习三-bower

使用 grunt、bower、node 模块部署到 heroku

使用 grunt 自动化 npm 和 bower 安装

Grunt、NPM 和 Bower 之间的区别( package.json 与 bower.json )

Grunt-injector 忽略来自 bower 依赖的 css 文件

Grunt、Gulp.js 和 Bower 有啥区别?为啥以及何时使用它们?