资讯专栏INFORMATION COLUMN

使用gulp+bower构建Angular.js项目

roland_reed / 684人阅读

摘要:本文重点是详细介绍项目的构建。是优秀的自动化项目构建工具,我们将用它完成等文件的的测试检查合并压缩格式化浏览器自动刷新部署文件生成,并监听文件在改动后重复指定的这些步骤热重载。是项目依赖管理工具。环境需求运行在环境,首先安装。

本文重点是详细介绍Angular.js项目的构建。gulp是优秀的自动化项目构建工具,我们将用它完成 javascript/less/css/html/images/fonts 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤(热重载)。bower是项目依赖管理工具。

环境需求

gulp运行在nodejs环境,首先安装nodejs。一般npm会随nodejs一起安装,npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)。可以用node -v查看安装的nodejs版本以及npm -v`查看npm的版本号。
安装bower:$ npm install -g bower

在windows环境中,git bsah 安装bower会出现错误,可以在切换到cmd中安装

初始化项目
$ cd d:/develop  #定位到develop目录
$ mkdir angular-gulp-bower-seed #新建项目目录
$ cd angular-gulp-bower-seed #进入项目目录
$ npm init #初始化项目,并在项目项目中自动生成package.json文件
$ bower init #新建bower.json

此时项目初始化完毕,可以开始安装项目依赖

#其他项目依赖也用此命令安装,这些依赖将自动安装到bower_component文件夹下,在代码中引入制定的位置即可
$ bower install angular jquery bootstrap --save-dev

安装时使用--save将自动保存配置信息至bower.json的dependencies数组中,使用--save-dev将自动保存配置信息至bower.json的devDependencies数组中。
保存至bower.json后,其他开发者对应下载即可(命令提示符执行bower install,则会根据bower.json下载所有依赖包,bower install --production只下载dependencies节点的包)。

安装gulp工具包
$ npm install -g gulp #全局安装gulp后可以在命令行中使用gulp命令,执行gulp任务
$ npm install --save-dev gulp  $本地安装gulp插件,以便在配置文件中调用gulp插件的功能
$ npm install autoprefixer-core babel-preset-es2015 browser-sync gulp-autoprefixer gulp-babel gulp-changed gulp-clean gulp-clean-css gulp-concat gulp-csso gulp-htmlmin gulp-jshint gulp-load-plugins gulp-ng-annotate gulp-ng-html2js gulp-rename gulp-rev gulp-rev-collector gulp-sequence gulp-size gulp-uglify gulp-useref http-server jasmine-core jshint jshint-stylish url --save-dev  #安装插件
构建项目目录

项目目录结构如下:

angular-gulp-bower-seed 
│  .bowerrc  //bower安装包目录配置
│  .gitignore
│  bower.json
│  gulpfile.js  //gulp配置文件,打包处理,开启服务等等
│  LICENSE
│  mockAPI.js  //构造.json数据文件后,通过读取文件方式模拟API请求,在前后端开发进度不一致时非常有用
│  package.json
│  README.md
│
├─app  //项目开发目录
│   │  angular.png.ico  //ico图标
│   │  app.js  //angular项目公共配置,包括主模块创建,路由配置,http拦截处理等
│   │  index-dist.html  // 供gulp编译,引入打包后的文件(script/styles/fonts)
│   │  index.html  SPA项目入口
│   │
│   ├─bower_components //bower管理的依赖库
│   │  ├─angular
│   │  ├─angular-bootstrap
│   │  ├─angular-cookies
│   │  ├─angular-local-storage
│   │  ├─angular-md5
│   │  ├─angular-resource
│   │  ├─angular-route
│   │  ├─angular-ui
│   │  ├─angular-ui-router
│   │  ├─bootstrap
│   │  └─jquery
│   ├─data //构建json格式的静态数据(mock datas)
│   │      csrfToken.json
│   │      login.json
│   │
│   ├─public //项目公共资源,包括字体,图片
│   │  ├─css
│   │  ├─fonts
│   │  └─images
│   │
│   └─src //项目源代码
│       ├─controllers  //控制器相关代码,语义化命名
│       │      appControllers.js
│       │
│       ├─directives  //自定义指令相关代码
│       │  │  directives.js  //指令脚本
│       │  │
│       │  └─tpls   //指令模板文件夹
│       │          datepicker.html
│       │          modal.html
│       │          pagination.html
│       │
│       ├─filters //过滤器代码
│       │      filters.js
│       │
│       ├─services //服务代码
│       │      apiServices.js //与API请求相关服务
│       │      app.util.js  //公共服务
│       │      services.js  //其他
│       │
│       ├─styles  //项目样式文件夹
│       │      app.css
│       │      directives.css
│       │      page1.css
│       │      page2.css
│       │
│       └─templates  //项目视图文件夹
│           │  app.html
│           │  login.html
│           │  noRight.html
│           │
│           ├─modalViews  //模态框视图文件夹
│           │
│           ├─page1Views  //按业务划分视图1文件夹
│           │
│           └─page2Views  //按业务划分视图2文件夹
│
│
├─appDist  //项目编译打包后生成目录
配置gulpfile.js
var gulp = require("gulp");
var gulpLoadPlugins = require("gulp-load-plugins");
var $ = plugins = gulpLoadPlugins();
var autoprefixer = require("gulp-autoprefixer");
var ngHtml2Js = require("gulp-ng-html2js");
var gulpif = require("gulp-if");
var uglify = require("gulp-uglify");//Minify JavaScript with UglifyJS2.
var cleanCSS = require("gulp-clean-css");
var htmlmin = require("gulp-htmlmin");
var jshint = require("gulp-jshint");    //jshint检测javascript的语法错误
var useref = require("gulp-useref");
var csso = require("gulp-csso");
var concat = require("gulp-concat");
var rename = require("gulp-rename");
const babel = require("gulp-babel");

var browserSync = require("browser-sync");
var reload = browserSync.reload;

var url = require("url");
var mockApi = require("./mockApi");

var distFolderUrl = "appDist";
gulp.task("clean", function () {
  return require("del")([distFolderUrl + "/**","tmp/**","dist/**"]);
});


gulp.task("templatesTpls", function () {
  return gulp.src([
      "./app/src/directives/tpls/*.html",
    ])
    .pipe(ngHtml2Js({
        moduleName: "myApp",
        prefix: "src/directives/tpls/"
    }))
    .pipe(concat("templatesTpls.min.js"))
    .pipe(babel({
        presets: ["es2015"]
    }))
    .pipe(uglify())
    .pipe(gulp.dest("./tmp/templates"))
});

gulp.task("templatesViews", function () {
  return gulp.src([
      "./app/src/templates/**/*.html"
    ])
    .pipe(ngHtml2Js({
        moduleName: "myApp",
        rename:function (templateUrl, templateFile) {
          var pathParts = templateFile.path.split("");
          var file = pathParts[pathParts.length - 1];
          var folder = pathParts[pathParts.length - 2];
          if ("templates" === folder) {
            return "./src/templates/" + file
          } else {
            return "./src/templates/" + folder + "/" + file
          }
        }
    }))
    .pipe(concat("templatesViews.min.js"))
    .pipe(babel({
        presets: ["es2015"]
    }))
    .pipe(uglify())
    .pipe(gulp.dest("./tmp/templates"))
});

gulp.task("copyTemplatesToDist", function () {
  return gulp.src([
      "./app/src/templates/**/*.html",
    ])
  .pipe(gulp.dest(distFolderUrl + "/src/templates"));
});

gulp.task("copyTplsToDist", function () {
  return gulp.src([
      "./app/src/directives/tpls/**/*.html",
    ])
  .pipe(gulp.dest(distFolderUrl + "/src/directives/tpls"));
});

// gulp.task("font", function() {
//   return gulp.src(["./app/public/fonts/**/*"], {base: "./app/"})
//   .pipe(gulp.dest(distFolderUrl + ""))
// });

// gulp.task("images", function() {
//   return gulp.src(["./app/public/images/**/*"], {base: "./app/"})
//   .pipe(gulp.dest(distFolderUrl + ""))
// });

gulp.task("public", function() {
  return gulp.src(["./app/public/**/*","./app/*.ico"], {base: "./app/"})
  .pipe(gulp.dest(distFolderUrl))
});


gulp.task("vendorCss",function () {
  return gulp.src(["./app/bower_components/**/*.css"])
    .pipe(gulp.dest(distFolderUrl + "/vendor"))
})
gulp.task("vendorFont",function () {
  return gulp.src([ "./app/bower_components/bootstrap/dist/fonts/**"])
    .pipe(gulp.dest(distFolderUrl + "/vendor/bootstrap/dist/fonts"))
})
gulp.task("vendorJs",function () {
  return gulp.src("./app/bower_components/**/*.js")
    .pipe(gulp.dest(distFolderUrl + "/vendor"))
})
// gulp.task("vendor", ["vendorCss", "vendorJs", "vendorFont"]);

gulp.task("vendor", function () {
  return gulp.src(["./app/bower_components/**/*"])
    .pipe(gulp.dest(distFolderUrl + "/vendor"))
});


var cssList = [
  "./app/src/styles/app.css",
  "./app/src/styles/*.css"
];

gulp.task("css", function() {
  return gulp.src(cssList)
    .pipe(autoprefixer({
      browsers: ["last 2 versions"],
      cascade: false
    }))
    .pipe(concat("app.min.css"))
    .pipe(cleanCSS())
    .pipe(gulp.dest(distFolderUrl + "/static/css"))
})


var jsList = [
  "./app/*.js",
  "./app/src/directives/*.js",
  "./app/src/controllers/*.js",
  "./app/src/services/*.js",
  "./app/src/filters/*.js",
  "./tmp/templates/*.js",
];

gulp.task("jshint", function () {
  return gulp.src(jsList)
    .pipe(reload({stream: true, once: true}))
    .pipe(jshint())
    .pipe(jshint.reporter("jshint-stylish"))
});

// gulp.task("js", ["jshint"], function () {
gulp.task("js", ["templatesTpls","templatesViews"], function () {
  return gulp.src(jsList)
  .pipe(concat("app.min.js"))
  .pipe(babel({
      presets: ["es2015"]
  }))
    .pipe(uglify({
            mangle: false,//类型:Boolean 默认:true 是否修改变量名
            compress: false,//类型:Boolean 默认:true 是否完全压缩
            preserveComments: "all" //保留注释
        }).on("error", function(e){
            console.log(e);
         }))
    .pipe(gulp.dest(distFolderUrl + "/static/js"))
});


gulp.task("htmlVendor", function () {
  return gulp.src(["app/index-vendor.html"])
    .pipe(useref({ searchPath: ["app"] }))
    // .pipe(rename("index1.html"))
    .pipe(gulpif("*.js", uglify({
            mangle: false,
            compress: false,
            preserveComments: "all"
        })))
    .pipe(gulpif("*.css", csso()))
    // .pipe(gulpif("*.html", htmlMinify({conditionals: true, loose: false})))
    .pipe(gulp.dest(distFolderUrl));
});

// gulp.task("html", ["copyTemplatesToDist", "copyTplsToDist"], function () {
gulp.task("html", function () {
  return gulp.src(["app/index-dist.html"])
    .pipe(rename("index.html"))
    .pipe(gulp.dest(distFolderUrl))
})



gulp.task("build", ["public","vendor","js","css","html"], function () {
  return gulp.src(distFolderUrl + "/**/*").pipe($.size({title: "build", gzip: true}));
});

gulp.task("default", ["clean"], function () {
  gulp.start("build");
});

  // var files = [
  //     "app/**/*.html",
  //     "app/**/*.css",
  //     "app/**/*.js",
  //     "app/public/**/*",
  //     "app/data/**/*"
  //   ];
  gulp.task("serve",  function () {
    browserSync({
      notify: false, // Don"t show any notifications in the browser.
      port: 8081,
      open: false,
      server: {
        baseDir: ["app"],
        routes: {
          // "bower_components": "bower_components",//if bower_components" path is up the tree of app
        },
        middleware:
            function (req, res, next) {
                var urlObj = url.parse(req.url, true),
                    method = req.method,
                    paramObj = urlObj.query;
                mockApi(res, urlObj.pathname, paramObj, next);
            }
      }
    });

    // watch for changes
    gulp.watch([
      "app/**/*.html",
      "app/**/*.css",
      "app/**/*.js",
      "app/public/**/*",
      "app/data/**/*"
    ]).on("change", reload);

    gulp.watch("app/src/**/*.less", ["styles", reload]);
    gulp.watch("bower.json", ["fonts", reload]);
  });

  gulp.task("serve-release",  function () {
    browserSync({
      notify: false,
      port: 8081,
      server: {
        baseDir: [distFolderUrl]
      }
    });

  });





运行gulp任务

gulp

$ gulp clean #清空编译目录
$ gulp build #编译打包
$ gulp serve #开启开发环境服务器 http://localhost:8080
$ gulp serve-release #开启生产环境服务器 http://localhost:8081

项目源码:angular-gulp-bower-seed

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84054.html

相关文章

  • gulp+mock实现前后端分离

    摘要:当然需要的工具不只有这些,其他的一些可选工具还有文件压缩压缩时用到的文件重命名检查一般编辑器自带校验提示工具等等,具体根据项目需要安装。 gulp 前端自动化构建工具 需要配置nodejs环境, 利用npm安装全局gulp,安装后可以输入gulp指令。 npm install gulp -g 创建项目目录、初始化npm包、gulp npm init gulp init 下载gul...

    dailybird 评论0 收藏0
  • angular - 收藏集 - 掘金

    摘要:如何在中使用动画前端掘金本文讲一下中动画应用的部分。与的快速入门指南推荐前端掘金是非常棒的框架,能够创建功能强大,动态功能的。自发布以来,已经广泛应用于开发中。 如何在 Angular 中使用动画 - 前端 - 掘金本文讲一下Angular中动画应用的部分。 首先,Angular本生不提供动画机制,需要在项目中加入Angular插件模块ngAnimate才能完成Angular的动画机制...

    AlexTuan 评论0 收藏0
  • [ 前端实习日记 ] 构建静态页面基础架构

    以前我们敲静态页面都是写好html,css, js,然后再去刷新浏览器,艾尼马又不行,有重新写过再刷新,一个页面下来按chrl+r的次数可让你的键盘多活好几天,要不会刷新快捷按钮那不得手残了都。 后来,grunt,gulp等工具应运而生,当然它们不止这个功能,但却很好地减轻了我们的负担。这篇文章介绍一些如何使用这些工具使构建页面变得简单高效。这只是个人的目前在用的不成熟的方案,更专业的还请参考...

    lidashuang 评论0 收藏0
  • 自定义前端构建工具生成器 generator-pg-cloud

    摘要:自定义前端构建工具生成器近期公司前端一直在做效率提升,流程优化,很荣幸这个担子落在了我身上,除了一些培训,分享之外,自己弄了个基于的前端构建环境生成器,在此分享给大家,觉得有用的请试用。,不出意料的话,构建环境已经生成完毕了。 自定义前端构建工具生成器generator-pg-cloud 近期公司前端一直在做效率提升,流程优化,很荣幸这个担子落在了我身上,除了一些培训,分享之外,自己...

    snowell 评论0 收藏0
  • angular 1.x多项目共享子项目实践之路

    摘要:可发布这一部分会在下一章管理对子项目引用中详细说明。总结本文总结了多项目共享子项目工程化方面的一些实践,并不涉及到复杂的代码,主要涉及到的概念,使用进行包管理,使用作为自动化工具等工程化的知识。 背景 公司的产品线涵盖多个产品,这些产品中会有一些相同的功能,如登录,认证等,为了保持这些功能在各个产品中的一致性,我们在各个产品中维护一份相同的代码。这带来了很大的不便:当出现新的需求时,不...

    mist14 评论0 收藏0

发表评论

0条评论

roland_reed

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<