在配置phonecat项目时需要运行npm start在本地配置一个服务器环境,npm start首先会安装一系列的必要程序,这些程序依赖package.json中的内容,package.json中的内容详解如下:

依赖包介绍

在克隆项目之后,目录如下:

➜angular-phonecat git:(master) ✗ tree -L 2.├── LICENSE├── README.md├── app│ ├── bower_components│ ├── css│ ├── img│ ├── index.html│ ├── js│ ├── partials│ └── phones├── bower.json├── package.json├── scripts│ ├── private│ └── update-repo.sh└── test	├── e2e	├── karma.conf.js	├── protractor-conf.js	└── unit20 directories, 8 files

这个目录下存在一个文件 package.json,该文件是做什么用的呢?

在 NodeJS 项目中,用 package.json 文件来声明项目中使用的模块,这样在新的环境部署时,只要在 package.json 文件所在的目录执行npm install命令即可安装所需要的模块。

关于 package.json 中可配置的选项请参考package.json字段全解。

从该文件可以看出 PhoneCat 的依赖:

"devDependencies": {	"karma": "^0.12.16",	"karma-chrome-launcher": "^0.1.4",	"karma-jasmine": "^0.1.5",	"protractor": "~1.0.0",	"http-server": "^0.6.1",	"tmp": "0.0.23",	"bower": "^1.3.1",	"shelljs": "^0.2.6"}

以及一些脚本:

"scripts": {	"postinstall": "bower install",	"prestart": "npm install",	"start": "http-server -a 0.0.0.0 -p 8000",	"pretest": "npm install",	"test": "node node_modules/karma/bin/karma start test/karma.conf.js",	"test-single-run": "node node_modules/karma/bin/karma start test/karma.conf.js--single-run",	"preupdate-webdriver": "npm install",	"update-webdriver": "webdriver-manager update",	"preprotractor": "npm run update-webdriver",	"protractor": "protractor test/protractor-conf.js",	"update-index-async": "node -e /"require('shelljs/global'); sed('-i', ///////@@NG_LOADER_START@@[//s//S]*//////@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@//n' + cat('bower_components/angular-loader/angular-loader.min.js') + '//n//@@NG_LOADER_END@@', 'app/index-async.html');/""}

从上可以看出运行npm start之前会运行npm install,然后运行http-server -a 0.0.0.0 -p 8000启动一个 web 服务器,最后是运行bower install安装 bower 管理的包。

bower 管理的包由 bower.json 文件定义:

{"name": "angular-phonecat","description": "A starter project for AngularJS","version": "0.0.0","homepage": "https://github.com/angular/angular-phonecat","license": "MIT","private": true,"dependencies": {"angular": "1.3.x","angular-mocks": "1.3.x","jquery": "~2.1.1","bootstrap": "~3.1.1","angular-route": "1.3.x","angular-resource": "1.3.x","angular-animate": "1.3.x"}}

当然,package.json 文件中还定义了一些测试相关的命令。

bower

关于bower的介绍,参考博客内文章:bower介绍。

在本项目中,bower 下载的包保存在 angular-phonecat/app/bower_components 目录下,依赖如下:

├── bower_components│ ├── angular│ ├── angular-animate│ ├── angular-mocks│ ├── angular-resource│ ├── angular-route│ ├── bootstrap│ └── jquery

karma

Karma是一个 Javascript 测试运行工具,可以帮助你关闭反馈循环。Karma 可以在特定的文件被修改时运行测试,它也可以在不同的浏览器上并行测试。不同的设备可以指向 Karma 服务器来覆盖实际场景。

关于 Karma 的使用,本文不做介绍。

http-server

http-server是一个简单的零配置命令行 HTTP 服务器,基于Node.js。

在命令行中使用方式是:

$ node http-server

在package.json 中定义方式是:

 "scripts": { "start": "http-server -a 0.0.0.0 -p 8000", }

支持的参数:

 -p 端口号 (默认 8080)-a IP 地址 (默认 0.0.0.0)-d 显示目录列表 (默认 'True')-i 显示 autoIndex (默认 'True')-e or --ext 如果没有提供默认的文件扩展名(默认 'html')-s or --silent 禁止日志信息输出--cors 启用 CORS -o 在开始服务后打开浏览器-h or --help 打印列表并退出-c 为 cache-control max-age header 设置Cache time(秒) ,禁用 caching, 则值设为 -1 .

Protractor

Protractor是一个端对端的测试运行工具,模拟用户交互,帮助你验证你的 Angular 应用的运行状况。

Protractor 使用Jasmine测试框架来定义测试。Protractor 为不同的页面交互提供一套健壮的 API。

当然,也有其他的端对端工具,不过 Protractor 有着自己的优势,它知道怎么和 AngularJS 的代码一起运行,特别是面临 $digest 循环的时候。

关于 Protractor 的使用,本文不做介绍。

ShellJS

ShellJS是Node.js扩展,用于实现 Unix shell 命令执行,支持 Windows。

一个示例代码:

require('shelljs/global');if (!which('git')) {echo('Sorry, this script requires git');exit(1);}// Copy files to release dirmkdir('-p', 'out/Release');cp('-R', 'stuff/*', 'out/Release');// Replace macros in each .js filecd('lib');ls('*.js').forEach(function(file) {sed('-i', 'BUILD_VERSION', 'v0.1.2', file);sed('-i', /.*REMOVE_THIS_LINE.*/n/, '', file);sed('-i', /.*REPLACE_LINE_WITH_MACRO.*/n/, cat('macro.js'), file);});cd('..');// Run external tool synchronouslyif (exec('git commit -am "Auto-commit"').code !== 0) {echo('Error: Git commit failed');exit(1);}

在 PhoneCat 中,主要是用在下面:

"update-index-async": "node -e /"require('shelljs/global'); sed('-i', ///////@@NG_LOADER_START@@[//s//S]*//////@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@//n' + cat('bower_components/angular-loader/angular-loader.min.js') + '//n//@@NG_LOADER_END@@', 'app/index-async.html');/""

测试

运行单元测试

PhoneCat 项目中的单元测试是使用 Karma 来完成的,所有的单元测试用例都存放在 test/unit 目录下。可以通过执行以下命令来运行单元测试:

$ npm test

值得一提的是,在运行单元测试前,计算机上必须安装 Google Chrome 浏览器,因为这里用到了 karma-chrome-launcher

运行端到端测试

PhoneCat 项目使用端到端测试来保证 Web 应用的可操作性,而这个端到端测试是通过使用 Protractor 来实现的,所有的端到端测试用例都存放在test/e2e 目录下。可以通过执行以下步骤来运行端到端测试:

//更新webdriver,此命令只需运行一次$ npm run update-webdriver//运行PhoneCat$ npm start

打开另一个命令行窗口,在其中运行:

$ npm run protractor

代码分析

在介绍了 PhoneCat 的运行和测试环境后,来看看 PhoneCat 的页面和 js 是怎么组织起来的。

  • 首先,从 index.html 内容可以看到 PhoneCat 页面使用 bootstrap 框架,并且引入了 jquery 以及 angular 的相关依赖,包括一些附加模块:路由动画资源
  • angular 应用范围由ng-app定义在 html 节点上,即作用于整个页面,其名称为phonecatApp
  • 通过ng-view指定加载子视图的位置,这里主要包括partials/phone-list.htmlpartials/phone-detail.html两个视图。
  • app.js 是应用的入口,并且依赖 animations.js、controllers.js、filters.js、services.js 等文件。从这里可以看出,一个 angular 应用的 js 大概包括哪几个部分的内容。

app.js 内容如下:

//JavaScript语法支持严格模式:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常;如果在运行期出现了违反严格模式的代码,则抛出执行异常。'use strict';/* App Module *///定义一个模块,模块名称和页面 ng-app 中内容一致var phonecatApp = angular.module('phonecatApp', ['ngRoute','phonecatAnimations','phonecatControllers','phonecatFilters','phonecatServices']);//定义路由phonecatApp.config(['$routeProvider',function($routeProvider) {$routeProvider.when('/phones', {templateUrl: 'partials/phone-list.html',controller: 'PhoneListCtrl'}).when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html',controller: 'PhoneDetailCtrl'}).otherwise({redirectTo: '/phones'});}]);

phonecatApp 模块依赖其他几个模块:ngRoute、phonecatAnimations、phonecatControllers、phonecatFilters、phonecatServices。

ngRoute 是内置的路由模块,定义路由规则:

  • 当访问/phones,由PhoneListCtrl控制器处理,并且由partials/phone-list.html模板渲染显示内容。
  • 当访问/phones/:phoneId,由PhoneDetailCtrl控制器处理,并且由partials/phone-detail.html模板渲染显示内容。
  • 如果不满足上面条件,则重定向到/phones

phonecatAnimations 模块是定义动画效果,没有真个模块不影响程序的主要功能的运行,故不分析这部分代码。

phonecatControllers 模块定义在 controllers.js 文件中:

'use strict';/* Controllers */var phonecatControllers = angular.module('phonecatControllers', []);// 定义 PhoneListCtrl,并注入 Phone 对象phonecatControllers.controller('PhoneListCtrl', ['$scope', 'Phone',function($scope, Phone) {$scope.phones = Phone.query();$scope.orderProp = 'age';}]);// 定义 PhoneDetailCtrl,并注入 Phone 对象和 $routeParams,$routeParams 封装了路由参数。phonecatControllers.controller('PhoneDetailCtrl', ['$scope', '$routeParams', 'Phone',function($scope, $routeParams, Phone) {$scope.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) {//回调方法$scope.mainImageUrl = phone.images[0];});$scope.setImage = function(imageUrl) {$scope.mainImageUrl = imageUrl;}}]);

phonecatFilters 模块定义在 filter.js 文件中,主要是自定义了一个过滤器checkmark:根据输入是否有内容判断返回还是

phonecatServices 模块定义在 services.js 文件中:

'use strict';/* Services */var phonecatServices = angular.module('phonecatServices', ['ngResource']);// 定义 Phone 服务,并提供了一个 query 方法,还包括一个内置的 get 方法。调用 get 方法实际上就是调用 query 方法,并且可以传递一个参数 phoneIdphonecatServices.factory('Phone', ['$resource',function($resource){return $resource('phones/:phoneId.json', {}, {query: {method:'GET', params:{phoneId:'phones'}, isArray:true}});}]);

npm start 作用的更多相关文章

  1. npm 的作用

    接触 npm 也有一个多月的时间了,一直只是将他作为当着 webstorm + node.js 环境中的一个插件来用(甚至说把她当着命令来用).毕竟大部分的时间,他是输入的命令行中的一部分(别笑,小新 ...

  2. Node.js NPM 作用

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json NPM ...

  3. Node.js入门:Node.js&NPM的安装与配置

    Node.js安装与配置      Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0. ...

  4. 在Windows平台上安装Node.js及NPM模块管理

    1. 下载Node.js官方Windows版程序:http://nodejs.org/#download    从0.6.1开始,Node.js在Windows平台上提供了两种安装方式,一是.MSI安 ...

  5. npm 介绍

    安装NPM NPM的全称是Node Package Manager,如果你熟悉ruby的gem,Python的PyPL.setuptools,PHP的pear,那么你就知道NPM的作用是什么了.没 错 ...

  6. Node.js&NPM的安装与配置(转)

    Node.js安装与配置 Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本 情况了,对此,我们将在0.6.x的 ...

  7. 详解npm的模块安装机制 --社会我npm哥,好用话不多

      依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm) 在一个npm项目下 ...

  8. Ubuntu14.04LTS下安装Node.js&NPM以及个人博客hexo的初始化配置

    什么是hexo Hexo 是一款基于node 的静态博客网站生成器作者 :tommy351是一个台湾的在校大学生...相比其他的静态网页生成器而言有着,生成静态网页最快,插件丰富(已经移植了大量Oct ...

  9. 了解 yarn 、npm、nodejs

    一.前言 针对即将上线的 jeecg-boot 做一些准备.   二.了解系列 1.了解 nodejs Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrom ...

随机推荐

  1. XCodeo如何去除多余的模拟器---学习笔记七

    首先退出Xcode并且关闭模拟器: 然后在终端(Terminal)输入如下2行命令: sudo killall -9 com.apple.CoreSimulator.CoreSimulatorServ ...

  2. 用C#调用C++DLL(x64),总是提示找不到DLL

    用C#调用自己写的C++ DLL(x64),总是提示找不到DLL,调试可以,发布release老是提示找不到DLL(dll文件确定存在) 原因:Visual C++的DLL分发方式没选:调试默认选择: ...

  3. 2015年3月阿里内推(c++研发)实习生电面经历

    2015年3月开学开始就听说阿里会有内推,果不其然在师兄的引荐下推了菜鸟网络,但是在学校的BBS上看到了阿里云部门,而且要会C++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ...

  4. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  5. bootstrap快速搭建属于自己的后台模板库

    不论做什么项目,我们都以快速搭建为主,设计师固然重要,但是,我们前端开发的也必须能给出自己以前做过什么样的模板,自己收藏的模板,或者我们弹框的形式,我的提示框的形式,我用的下拉框的插件,日历的插件,我 ...

  6. IP多媒体子系统(IP Multimedia Subsystem,IMS)

      目录 1 什么是IP多媒体子系统[1] 2 IMS产生的背景[2] 3 IMS的特点分析[3] 4 IMS中的功能实体[3] 5 IMS中的接口和协议[3] 6 参考文献 [编辑] 什么是IP多媒 ...

  7. Sniffer的完整代码,基于winpcap抓包统计吞吐量

    using System; using System.Net; using System.Net.Sockets; using System.Net.NetworkInformation; using ...

  8. Hibernate批量处理海量数据的方法

    本文实例讲述了Hibernate批量处理海量数据的方法.分享给大家供大家参考,具体如下: Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存.从它的机制上讲,Hibern ...

  9. python设计模式

    本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复 ...

  10. spring mvc 项目聚合

    创建一个maven 项目当父项目 创建时选择默认就可以 创建完成后 修改 pom.xml文件  把 packaging 的war改为pom <modelVersion>4.0.0</ ...