Yeoman 官网教学案例:使用 Yeoman 构建 WebApp
本文是对 Yeoman 官网教学案例的翻译。
STEP 1:设置开发环境

与 Yeoman 的所有交互都是通过命令行。Mac 系统使用 terminal.app,Linux 系统使用 shell,windows 系统可以使用 cmder/PowerShell/cmd.exe。
1.1 安装条件
安装yeoman之前,你需要先安装如下内容
- Nodejs v4 或者更高版本
- npm
- git
通过以下命令检查是否安装 Node 环境以及 npm 管理工具。
$ node -v && npm -v
npm 默认随 Node 一起安装。有些 Node 版本可能安装的是旧版本的 npm,你可以通过以下命令更新 npm
$ npm install -g npm@latest
通过以下命名检查是否安装git
$ git --version
1.2 安装yeoman工具箱
如果已经安装了 node 环境,可以通过以下命令安装 Yeoman
$ npm install -g yo
1.3 确认安装
首先确认 Yeoman 是否正确安装
$ yo --version
STEP 2:安装Yeoman生成器
在传统的 web开发中,你需要花大量时间为你的 webapp 设置模板代码、下载依赖包以及手动创建文件目录结构。Yeoman 的生成器会帮你搞定这一切。让我为 FountainJS 项目安装一个生成器。
2.1安装生成器
你可以通过 npm 命令安装 Yeoman 生成器,目前可用的生成器超过了 3500 个,大多数都是开源社区贡献的。
通过以下命令安装 generator-fountain-webapp
$ npm install -g generator-fountain-webapp
该命令将安装生成器所需的node包。
和使用 npm install 一样,你可以通过 Yeoman 的交互菜单搜索 generators。
运行 yo 然后选择 Install a generator 来搜索发布的生成器。

STEP 3:使用生成器搭建我们的app
我们已经使用多次“脚手架”这个词,但是你可能还不知道它是什么意思。在 Yeoman的 语境中,脚手架材料表示通过一些配置为你的 webapp 生成文件。在这一步中,你会看到 Yeoman 如何为你喜欢的库及框架生成文件,以及使用如 webpack/babel/Sass 等一些额外的库的配置。
3.1 创建项目文件夹
创建 mytodo 文件夹
$ mkdir mytodo && cd mytodo
生成器生成的脚手架文件会放在这个文件夹中。
3.2 通过 Yeoman 菜单使用生成器
再次运行 yo
$ yo
如果你已经安装了多个 generator,你需要从中选择一个。选中 Fountain Webapp,按回车 enter 运行生成器。

3.3 配置生成器
为了加快开发环境的初始化设置,有些生成器也会提供选项来自定义你的app的基础开发库。
FountainJS 生成器提供一些选项来匹配你的喜好。
- 框架(React,Angular2,Angular1)
- 模块管理工具(Webpack,SystemJS,none with bower)
- JavaScript预处理器(babel,TypeScript,none)
- css 预处理器(Sass,Less,none)
- 三个模板app(a landing page,hello world,TodoMVC)
在该案例中,我们会使用 React, Webpack, Babel, SASS,Redux TodoMVC 模板。

方向键选择,回车键确认。

Yeoman 会自动搭建你的 app,获取依赖包。几分钟之后我们将进行下一步。

STEP 4:查看Yeoman生产的app的目录结构
打开你的 mytodo
目录,看一下脚手架搭建了什么。应该如下图所示:

在 mytodo 文件夹中,我们有:
src: web应用的父目录
app:React+Redux的代码index.html:基础html文件index.js:TodoMVC app 的入口文件
conf:配置文件及第三方工具的父目录(Bowersync,Webpack,Gulp,karma)
gulp_tasks 和 gulpfile.js:构建任务
.babelrc,package.json,node_modules:配置以及所需依赖包
.gitattributes 和 .gitignore:git的配置
STEP 5:在浏览器中预览你的app
如果想要在你喜欢的浏览器上预览你的 web app,你无须在电脑上做任何事情来设置本地服务器。这些都是 Yeoman 所做的一部分。
5.1 打开服务器
运行 npm 脚本,创建在 localhost:3000 (或者127.0.0.1:3000) 上预览的基于 node 的本地 http 服务器。
$ npm run serve
在浏览器的新页面打开localhost:3000

5.2 停止服务器
如果你想停止服务器,按 Ctrl + C 停止当前 CLI 的进程
注意:你不能在同一端口运行多个http服务器(默认3000)
5.3 查看你的文件
打开你喜欢的文本编辑器开始做点改变。每一次改变都会强制浏览器刷新而不需要你亲自操作。这种方式叫做即时加载(live reloading),可以实时查看app状态。
即时加载的功能是通过配置 gulpfile.js 中的 gulp tasks 以及 gulp_tasks/browsersync.js 中的 Browsersync 实现的。它会监测你的文件的变化然后自动加载。
如下,我们编辑 src/app/components 路径下的 Header.js

修改立即生效

STEP 6:使用karma和jasmine测试
有些人可能不熟悉Karma,它是不依赖于框架的测试运行器。Fountainjs 生成器中已经包含 jasmine 测试框架。。。。
6.1 运行测试单元
让我们返回命令行按 Ctrl+C 停止本地服务器。package.json 中已经有了运行测试单元的 npm 脚本。可以如下运行
$ npm test
每一个测试都应该通过.
6.2 升级单元测试
你可以在 src 文件夹中找到单元测试脚本,打开 src/app/reducers/todos.spec.js 。这是为 Todos reducers 编写的单元测试。举个例子,我们看一下验证初始状态的第一个测试。
it('should handle initial state', () => {
expect(
todos(undefined, {})
).toEqual([
{
text: 'Use Redux',
completed: false,
id: 0
}
]);
});
按如下修改
it('should handle initial state', () => {
expect(
todos(undefined, {})
).toEqual([
{
text: 'Use Yeoman', // <=== here
completed: false,
id: 0
}
]);
});
重新运行 npm test,可以看到如下错误:
if you want run test automatically on change you can use npm run test:auto instead
打开 src/app/reducers/todos.js
把初始状态改成
const initialState = [
{
text: 'Use Yeoman',
completed: false,
id: 0
}
];
你成功修复了测试

如果你的 app 越来越大或者更多的开发者参与进来,编写单元测试可以更容易的发现 bug。
STEP 7:使用 Local Storage 永久保存 todos
让我们重新看一下当刷新浏览器时 React/Redux mytodo 不能保存的问题。
7.1 安装 npm 包
为了轻松解决这个问题,我们可以使用另一个Redux模块“redux-localstorage”,它可以快速执行local storage。
运行以下命令
$ npm install --save redux-localstorage@rc

7.2 使用redux-localstorage
Redux 需要配置才能使用,将 src/app/store/configureStore.js 修改如下
import {compose, createStore} from 'redux';
import rootReducer from '../reducers';
import persistState, {mergePersistedState} from 'redux-localstorage';
import adapter from 'redux-localstorage/lib/adapters/localStorage';
export default function configureStore(initialState) {
const reducer = compose(
mergePersistedState()
)(rootReducer, initialState);
const storage = adapter(window.localStorage);
const createPersistentStore = compose(
persistState(storage, 'state')
)(createStore);
const store = createPersistentStore(reducer);
if (module.hot) {
// Enable Webpack hot module replacement for reducers
module.hot.accept('../reducers', () => {
const nextReducer = require('../reducers').default;
store.replaceReducer(nextReducer);
});
}
return store;
}
如果你浏览器中查看应用程序,你会在待办事项列表看到一项“Use Yeoman”。
应用程序初始化时,如果本地存储是空的,则列表中不会有事项。

继续前进,并添加一些项目到列表中:

现在当我们刷新浏览器列表项依然存在。万岁!
我们可以确认一下数据是否保存在本地存储中,打开chrome浏览器的检查工具,产看 Resources 面板,从左边栏选择 Local Storage

STEP 8:为生产做准备
准备好把你 todo 应用程序展示给世界了吗?让我们尝试建立一个准备生产的版本。
8.1 优化产品文件
为了创建应用程序的生产版本,我们需要
- 检查代码
- 合并和缩小脚本及样式来减少网络请求
- 编译预处理器的输出结果
- 使应用程序更精炼
哇!令人惊讶的是,所有运行都可以通过:
$ npm run build
你的准备就绪的应用程序在 mytodo 项目的 dist 目录下,你可以使用 FTP 发布到服务器。
8.2 建立及预览生产的应用程序
如果想在本地预览 app,可以运行下面的 npm 脚本
$ npm run serve:dist
它会创建你的项目并且启动本地服务器。

Yeoman 官网教学案例:使用 Yeoman 构建 WebApp的更多相关文章
- angular 官网英雄案例 报错整理
1.导入of 报错 import { of } from 'rxjs/observable/of'; 2. 服务注入报错 在app.module.ts引入 3.使用angular-in-memory- ...
- Vue(二十二)vuex小案例(官网计数案例整合)
1.使用 vue-cli 创建项目(具体操作可以参考前面的文章) ... 2.下载 vuex - npm install vuex -S 3.将 vuex 添加到项目中 (1)在项目中创建store文 ...
- 基于 Azure IaaS 搭建企业官网的规划和实践
本课程主要介绍了基于 Azure IaaS 搭建企业官网的案例分析和实践,实践讲解如何使用 Azure 门户创建虚拟机, 创建虚拟网络, 创建存储账户等. 具体包括项目背景介绍, 项目架构, 准备和实 ...
- MXNet官网案例分析--Train MLP on MNIST
本文是MXNet的官网案例: Train MLP on MNIST. MXNet所有的模块如下图所示: 第一步: 准备数据 从下面程序可以看出,MXNet里面的数据是一个4维NDArray. impo ...
- spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包
下载spring http://spring.io/ 最重要是在特征下面的这段话,需要注意: All avaible features and modules are described in the ...
- Vue组件化应用构建 官网例子 Unknown custom element: <todo-item>
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...
- ECharts概念学习系列之ECharts官网教程之自定义构建 ECharts(图文详解)
不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%84%E5%BB%BA%2 ...
- 【工利其器】必会工具之(二)Android开发者官网篇
前言 当刚开始踏入Android程序员这个行业的时候,想必绝大多数的人都和笔者一样,热血沸腾,激情四射,买了很多讲解Android开发的书籍.当开发某个功能需要学习某方面知识的时候,大家又成了“面向百 ...
- [踩过的坑]Elasticsearch.Net 官网示例的坑
经过昨天的ElasticSearch 安装,服务以及可以启动了,接下来就可以开发了,找到了官网提供的API以及示例,Es 官方提供的.net 客户端有两个版本一个低级版本: [Elasticsearc ...
随机推荐
- CSS 3学习——animation动画
以下内容根据官方文档翻译以及自己的理解整理. 1. 介绍 本方案介绍动画(animations).通过动画,开发者可以将CSS属性值的变化指定为一个随时间变化的关键帧(keyframes)的集合.在 ...
- SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
- ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)
操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...
- C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
- Highcharts中国地图热力图
最近有个项目需要将MC销量按大陆各省统计,并以中国地图人力图效果显示.由于项目一直使用Highcharts进行图表的统计,故采用Highmaps来实现. 效果如下: 1)中国各个省.直辖市.自治区: ...
- 流程表单中js如何清空SheetUser控件数据?
昨天有人问我js怎么清空.我试了试,发现简单的赋给他空值,并没有用.只能给他赋一个真实存在的值才有用.于是跟踪了一下他的删除按钮. 效果如下 使用场景:可以根据字段的不同类别变更人员. js代码如下, ...
- vim的一些常用命令(一)
先确认在Normal模式下,如不确认,请按几次Esc. :sy on/clear sy表示语法高亮,on是打开.clear是取消. :set go= set表示一般性设置,go是gui option的 ...
- 内网穿透神器ngrok
相信做Web开发的同学们,经常会遇到需要将本地部署的Web应用能够让公网环境直接访问到的情况,例如微信应用调试.支付宝接口调试等.这个时候,一个叫ngrok的神器可能会帮到你,它提供了一个能够在公网安 ...
- Redis集群搭建与简单使用
介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...
- 通过扩展让ASP.NET Web API支持JSONP
同源策略(Same Origin Policy)的存在导致了"源"自A的脚本只能操作"同源"页面的DOM,"跨源"操作来源于B的页面将会被拒 ...