前言

刚进入我司的时候我也是个啥都不懂得菜鸟,对于angularJs的印象也就是停留于他的指令,并且他的指令可以作为 标签使用,这样可以极大的减少代码量,【实习的时候曾和大牛短暂接触过,看了这段代码】。
我司的angularJs项目是分模块化的,在我刚进入公司的时候,我直接就可以新建模版引擎以及对应的controller、router、service方法,每一个js都可以被依赖注入,后期在深入的时候可以去写component、directive,这样一个好处是方便上手,可以在短时间内操作页面的更删改查,项目结构清晰,减少代码耦合;但同时也有它的弊端,那就是完全不知道一个项目是如何搭建起来的。现在我开始着手搭建一个新的项目,我就来记录一下我是如何将这个项目搭建起来的。

npm

1 dependencies以及devDependencies的区别

*dependencies 项目运行时所需要的文件
*devDependencies 开发时需要而线上运行时不需要的文件

1 npm中主要用到的cli

* npm init : 初始化package.json文件,有些有括号的则说明是默认有的,不填也可以

    在这个里面有一个用法
"scripts": {
    "buildpc": gulp,"test": "echo 22222"
  }
在cmd中执行时可以npm run test/buildpc,这样就可以去执行对应的程序。
    
* npm install/i --save:安装到dependencies
* npm install/i --save-dev:安装到devDependencies
* npm search :搜索npm模块,但是这个search速度很慢,可以在谷歌中搜索然后直接下载,在搜索的结果中也会有这个项目的git地址

2 我在这个项目中主要用到的devDependencies【按照它们的作用去划分】

del:
        "del": //删除文件
    css:
        "gulp-sass": //编译为css
        "gulp-clean-css": //压缩为min.css
        "gulp-rename": //重命名
    html:
        "gulp-htmlmin": //压缩html
        "gulp-flatten": //去掉文件夹层次,将他们提到同级目录下
    js:
        "jshint" + "gulp-jshint": //js语法检查,后者是依赖于前者的,
        "gulp-concat": //合并js,
        "gulp-uglify": //混淆js,合并到同一行,
        "gulp-flatten": //重命名,改为.min.js,
    others:
        "browser-sync": //自动刷新浏览器,
        "http-proxy-middleware": //中转站,将ajax请求转发到test域名,
    gulp-others:【暂时未用】
        "gulp-bower": "0.0.13","gulp-cdn-replace": "^0.3.0","gulp-filter": "^4.0.0","gulp-rev": "^7.1.2","gulp-rev-collector": "^1.0.5","gulp-useref": "^3.1.2",

bower

1 为什么要使用bower

便于查看项目依赖的文件以及版本号,同时也可以查看依赖文件本身所依赖的文件

2 常用的cli

* bower init : 初始化package.json文件,有些有括号的则说明是默认有的,不填也可以
* bower install/i --save:安装到dependencies
* bower install/i --save-dev:安装到devDependencies
* bower search :搜索bower模块,速度还行
* bower register :注册bower,release版本后才能bower install
* bower unregister :

3 angularJs项目中所需要用到的bower

"angular": "^1.5.8",//angularJs.min.js
    "angular-ui-router": "^0.3.1",//ui-router

gulpfile

1 简单的小栗子

gulp.task('step1',function () {
        console.log('This is step1');
    });
    gulp.task('step2',['step1'],function () {
        console.log('This is step2');
    });
    gulp.task('step3',[ 'step1','step2'],function () {
        console.log('This is step3');
    });
    //[ 'step1','step2']这里的是并发执行
    gulp.task('step4',function () {
        return gulp.src([
            'src/*.model.js','src/*.service.js'
        ])//这里的src会按照先后顺序去执行编译,而不是并发执行
            .pipe(gulp.dest('dist'));//gulp.dest输出dist目录
    });

2 在一个gulpfile中有多个项目去编译

var ENV_PC = 'pc';
    var ENV_MOBILE = 'mobile';
    
    var env = 'pc';
    
    // pc
    var pcPaths = {
        app: 'apps/' + env,libs: 'bower_components',dist: 'dist/' + env,filters: 'filters',models: 'models',services: 'services'
    };
    
    gulp.task('build:pc',['clean'],function() {
        env = ENV_PC;
        gulp.start('step1');
    });
    
    gulp.task('build:mobile',function() {
        env = ENV_MOBILE;
        gulp.start('step1');
    });
    
    gulp.task('step1',function () {
        console.log(111,env);
    });

3 CLI

* gulp :默认执行default的task
* gulp <任务名>: 执行特定任务

4 项目中的gulpfile.js文件

'use strict';

 var proxyHost = 'http://127.0.0.1:8000';//输入自己的测试地址
var cdnDomain = '';

var templateConfig = {
    cdnPrefix: 'http://127.0.0.1:8000/'//输入自己的cdn地址
};

var htmlminConfig = {
    collapseWhitespace: true
};

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var flatten = require('gulp-flatten');
var filter = require('gulp-filter');
var htmlmin = require('gulp-htmlmin');
var cleanCSS = require('gulp-clean-css');
var del = require('del');
var sass = require('gulp-sass');
var rev = require('gulp-rev');
var revCollector = require('gulp-rev-collector');
var cdn = require('gulp-cdn-replace');
var browserSync = require('browser-sync').create();
var proxyMiddleware = require('http-proxy-middleware');

var proxy = proxyMiddleware('/ajax',{
    target: proxyHost,changeOrigin: true,pathRewrite: {
        '^/ajax': ''
    }
});

const ENVIRONMENT = {
    PC: 'pc',MOBILE: 'mobile'
}

var path = {};

function initEnvironment(env) {
    path = {
        app: 'apps/' + env,services: 'services'
    };
}

gulp.task('watch',['build'],function() {
    gulp.watch(path.libs + '/**/*',['build:vendor']);
    gulp.watch([
        path.app + '/scss/*.scss'
    ],['build:css']);
    gulp.watch([
        path.app + '/components/*.component.js',path.app + '/components/*.controller.js',path.app + '/directives/*.directive.js',path.app + '/pages/*.controller.js',path.app + '/pages/*.router.js',path.app + '/pages/*.js',path.filters + '/*.filter.js',path.models + '/*.model.js',path.services + '/*.service.js'
    ],['build:js']);
    //gulp.watch(path.assets + '/fonts/*',['build:fonts']);
    gulp.watch(path.app + '/images/*',['build:images']);
    gulp.watch(path.app + '/**/*.html',['build:html']);
});

gulp.task('lint',function() {
    return gulp.src([
        path.app + '/components/*.component.js',path.services + '/*.service.js'
    ])
        .pipe(jshint())
        .pipe(jshint.reporter('default'));
});

gulp.task('build',[
    'build:js','build:css',//'build:fonts','build:images','build:vendor','build:html','build:others'
]);

// css task
gulp.task('build:css',function() {
    return gulp.src([
        path.app + '/scss/*.scss'
    ])
        .pipe(concat('turnado.css'))
        .pipe(sass().on('error',sass.logError))
        .pipe(gulp.dest(path.dist + '/assets/css'))
        .pipe(cleanCSS())
        .pipe(rename({suffix: '.min'}))
        .pipe(gulp.dest(path.dist + '/assets/css'))
});

// vendor task
gulp.task('build:vendor',function() {
    return gulp.src(path.libs + '/**/*')
        .pipe(gulp.dest(path.dist + '/vendor'));
});

//js task
gulp.task('build:js',['lint'],path.services + '/*.service.js'
    ])
        .pipe(concat('turnado.js'))
        .pipe(gulp.dest(path.dist + '/assets/js/'))
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))
        .pipe(gulp.dest(path.dist + '/assets/js/'));
});

//html task
//html index task
gulp.task('build:html:index',function() {
    return gulp.src([
        path.app + '/pages/index.html'
    ])
        .pipe(cdn({
            dir: path.dist,root: {
                js: cdnDomain,css: cdnDomain
            }
        }))
        .pipe(gulp.dest(path.dist));
});
//html views task
gulp.task('build:html:views',function() {
    return gulp.src([
        path.app + '/pages/*/*.html'
    ])
        .pipe(flatten())
        .pipe(cdn({
            dir: path.dist,css: cdnDomain
            }
        }))
        .pipe(gulp.dest(path.dist + '/views'));
});
//html shared task
gulp.task('build:html:shared',function() {
    return gulp.src([
        path.app + '/shared/*.html'
    ])
        .pipe(flatten())
        .pipe(cdn({
            dir: path.dist,css: cdnDomain
            }
        }))
        .pipe(gulp.dest(path.dist + '/views/shared'));
});
// components task
gulp.task('build:html:components',function() {
    return gulp.src([
        path.app + '/components/**/*.html'
    ])
        .pipe(flatten())
        .pipe(cdn({
            dir: path.dist,css: cdnDomain
            }
        }))
        .pipe(gulp.dest(path.dist + '/views/components'));
});
gulp.task('build:html',[
    'build:html:index','build:html:views','build:html:shared','build:html:components'
]);

// images task
gulp.task('build:images',function() {
    return gulp.src([
        path.app + '/images/**/*'
    ])
        .pipe(gulp.dest(path.dist + '/assets/images'));
});

gulp.task('build:others',function() {
    return gulp.src([
        'robots.txt','baidu_verify_*.html','.htaccess'
    ])
        .pipe(gulp.dest(path.dist));
});

gulp.task('debug',['watch'],function () {
    browserSync.init({
        startPath: '/',server: {
            baseDir: path.dist
        },//browser: 'google chrome',middleware: [proxy]
    });

    gulp.watch(path.dist + '/**/*').on('change',browserSync.reload);
});

gulp.task('clean',function () {
    return del(path.dist);
});

gulp.task('default',function() {
    gulp.start('build:pc');
    gulp.start('build:mobile');
});

gulp.task('build-pc',function() {
    initEnvironment(ENVIRONMENT.PC);
    gulp.start('build');
});

gulp.task('build-mobile',function() {
    initEnvironment(ENVIRONMENT.MOBILE);
    gulp.start('build');
});

gulp.task('debug-pc',function() {
    initEnvironment(ENVIRONMENT.PC);
    gulp.start('debug');
});

gulp.task('debug-mobile',function() {
    initEnvironment(ENVIRONMENT.MOBILE);
    gulp.start('debug');
});

index.html

引入需要用的js、css文件

index.js

(function() {
    angular.module('mall',[
        'ui.router','angular-carousel'
    ])
        .constant('xx',{
            xx: 2,xx: 1
        })//定义常量,减少硬编码
    angular.module('admin.services',[]);//处理业务逻辑
    angular.module('admin.models',[]);//底层ajax请求
    angular.module('admin.directives',[]);//指令,处理dom操作
    angular.module('admin.components',[]);//组件
    angular.module('admin.filters',[]);//过滤器
})();

angular
    .module('mall')
    .controller('MainCtrl',MainCtrl)
    .config(mainConfig)
    .run(mainRun);

MainCtrl.$inject = ['$rootScope','$scope'];

function MainCtrl($rootScope,$scope) {
    var vm = this;
}

mainConfig.$inject = ['$urlRouterProvider','$locationProvider'];
function mainConfig($urlRouterProvider,$locationProvider) {
    $locationProvider.hashPrefix('!');
    $locationProvider.html5Mode(false);
    $urlRouterProvider.otherwise("/home");//定义入口文件
}

mainRun.$inject = ['$rootScope','$state'];
function mainRun($rootScope,$state) {
    $rootScope.$state = $state;
}

组件,作为标签元素使用,directive的一种,将需要依赖于scope的directive写成组件是有好处的第一是使项目中的directive更有独立性第二是可以避免directive文件在controller加载完成之前就compile,这样directive中的scope依赖的变量成为局部变量

angularJs项目搭建的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  3. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. css绝对定位如何在不同分辨率下的电脑正常显示定位位置?(一定要看!)

    这篇文章主要介绍了css绝对定位如何在不同分辨率下的电脑正常显示定位位置,本文首先解释了常见的电脑分辨率,为了页面在不同的分辨率下正常显示,要给页面一个安全宽度,再去使用绝对定位,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。

  6. 详解HTML5中CSS外观属性

    这篇文章主要介绍了HTML5中CSS外观属性的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,,需要的朋友可以参考下

  7. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML文本属性&amp;颜色控制属性的实现

    这篇文章主要介绍了HTML文本属性&颜色控制属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部