Yeoman 学习笔记
yoeman 简介:http://www.infoq.com/cn/news/2012/09/yeoman
yeoman 官网: http://yeoman.io/
yeoman 是快速创建骨架应用程序的WEB前端工具,实际由 yo, grunt, bower 三个组建而成。
Yo scaffolds out a new application, writing your Grunt configuration and pulling in relevant Grunt tasks that you might need for your build.
Grunt is used to build, preview and test your project, thanks to help from tasks curated by the Yeoman team and grunt-contrib.
Bower is used for dependency management, so that you no longer have to manually download and manage your scripts.
简单来说就是 Yo 是配置 Grunt 的 task 的工具,Grunt 是一个部署、预览和测试前端项目的工具,而 Bower 是一个包的管理工具,可以下载 jquery, backbone 等库。
PS: 要运行 yeoman 首先需要配置环境,配置好 node.js 、git 环境。
下面开始写一个 todo-list demo 作为例子
一、首先安装 yo,这会自动安装 grunt, bower
npm install -g yonpm install -g generator-webapp
PS: yo 是命令开头,webapp 是 另外一个参数. yo 可以生成其他各种应用配置。如 backbone, angularjs等,前提首先安装 generator-backbone,即
yo webapp
此时可以看到
webapp 默认带有 Sass 版的 bootstrap库,等到下载完毕后可以看到以下文件:
app 为项目主目录,是部署的根目录
node_modules 为 nodejs的包文件
test 为测试目录,专门用于单元测试,用的是 mocha 来测试
Gruntfile.js 是配置 grunt 自动化任务的配置文件,具体配置可以参考下 Grunt官网
二、添加JS库,这里添加 backbone,bower 会自动下载 underscore.
bower install backbone
三、运行
grunt server
它将运行应用,并监控文件的变化,一旦有改变,就会自动刷新浏览器。
文件又这几个,用的是
- HTML5 Boilerplate 模板(默认)
- RequireJS (可选)
四、开始写应用
index.html
<!doctype html> <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--> <!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title></title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <!-- Place favicon.ico and apple-touch-icon.png in the root directory --> <!-- build:css(.tmp) styles/main.css --> <link rel="stylesheet" href="styles/bootstrap-2.3.2.min.css"> <link rel="stylesheet" href="styles/main.css"> <!-- endbuild --> <!-- build:js scripts/vendor/modernizr.js --> <script src="bower_components/modernizr/modernizr.js"></script> <!-- endbuild --> </head> <body> <div class="container"> <div class="todo-container"> <div class="header"> <h2>Todo List</h2> <div class="todo-input"> <div class="controls"> <input type="text" placeholder="Enter to save" class="todo-input-text" autofocus> </div> </div> </div> <div class="content"> <div class="todo-item-list todo-undone-list clearfix"> <p>Things to do:</p> </div> <div class="todo-item-list todo-done-list clearfix"> <p>Done Things:</p> </div> </div> <div class="footer"> </div> </div> </div> <script type="text/template" id="todo-input-template"> </script> <script type="text/template" id="todo-item-template"> <span class="order"><%= order%></span> <a href="javascript:void(0);" class="done-<%= done%>"> <b><%= title%></b> <button title="删除" class="btn btn-mini pull-right todo-item-remove"><i class="icon-remove"></i></button> <% if (done) { %> <button title="撤销" class="btn btn-mini pull-right todo-item-undone"><i class="icon-repeat"></i></button> <% } else { %> <button title="完成" class="btn btn-mini pull-right todo-item-done"><i class="icon-ok"></i></button> <% } %> </a> </script> <!--[if lt IE 7]> <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> <![endif]--> <!-- build:js scripts/main.js --> <script data-main="scripts/main" src="bower_components/requirejs/require.js"></script> <!-- endbuild --> </body> </html>
main.coffee
require.config baseUrl : './scripts/' shim : underscore : exports : '_' backbone : deps : [ 'underscore' 'jquery' ] exports : 'Backbone' backboneLocalStorage : deps : [ 'backbone' ] app : deps : [ 'underscore' 'jquery' 'backbone' ] paths : jquery : '../bower_components/jquery/jquery' underscore : '../bower_components/underscore/underscore' backbone : '../bower_components/backbone/backbone' backboneLocalStorage: '../bower_components/backbone/examples/backbone.localStorage' require ['app'], (app) -> app.init()
app.coffee
define 'app', ['jquery', 'underscore', 'backbone', 'backboneLocalStorage'], ($, _, Backbone) -> TodoModel = Backbone.Model.extend defaults : () -> title : 'Untitle', done : false, order : Todos.length+1 initialize : () -> this.save() TodoList = Backbone.Collection.extend model : TodoModel localStorage : new Backbone.LocalStorage 'todos-backbone' done : () -> this.where done : true Todos = new TodoList # todo 集合 TodoView = Backbone.View.extend tagName : 'div' # 外容器 template : _.template $('#todo-item-template').html() # 模板HTML # 初始化,坚听对象 initialize : () -> this.listenTo this.model, 'change', this.render this.listenTo this.model, 'destroy', this.remove # 事件绑定 events : 'click button.todo-item-done' : 'done' 'click button.todo-item-remove' : 'clear' 'click button.todo-item-undone' : 'undone' done : () -> if this.model.get('done') == false # 本身是未完成状态的 this.model.set done : true this.remove() undone : () -> if this.model.get('done') == true # 本身是完成状态的 this.model.set done : false this.remove() clear : () -> this.model.destroy() render : () -> this.$el.html this.template this.model.toJSON() return this AppView = Backbone.View.extend # 初始化保存DOM对象 initialize : () -> this.$input = this.$('.todo-input-text').focus() this.$todoList = this.$('.todo-undone-list') this.$todoDoneList = this.$('.todo-done-list') this.listenTo Todos, 'add', this.addOne this.listenTo Todos, 'change:done', this.addOne Todos.fetch() events : 'keypress input.todo-input-text' : 'createOnEnter' # Enter 时保存 createOnEnter : (e) -> if e.keyCode != 13 return if !this.$input.val() return; Todos.create title: this.$input.val() this.$input.val('') addOne : (todo) -> view = new TodoView model : todo if todo.get('done') # 已经完成的加入已完成列表 this.$todoDoneList.append(view.render().el); else # 未完成的加入未完成列表 this.$todoList.append(view.render().el); # Todos.each (todo) -> todo.save() App = new AppView el : $('.todo-container') # 主应用UI return init : () -> Backbone.history.start()
main.css
.todo-container { margin: 50px auto 0 auto; width: 300px; } .todo-item-list { margin-top: 20px; } .todo-item-list > div { float: left; width: 90%; margin-top: 10px; padding-left: 5%; } .todo-item-list > div a:hover { text-decoration: none; } .todo-item-list > div button { margin: 0 3px; } .todo-item-list > div span.order { margin-right: 10px; color: #B6B6B6; font-style: italic; } .todo-item-list > p { font-weight: bold; margin-top: 1em; }
效果图
补充:
这里用的是 coffeescript,yeoman会自动转成js。关于todo-list,可以上官网参考下,我这里简化了部分代码。
Yeoman 学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- 前端CSS预处理器Sass
前面的话 "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- HTML渲染过程详解
无意中看到寒冬关于前端的九个问题,细细想来我也只是对第一.二.九问有所了解,正好也趁着这个机会梳理一下自己的知识体系.由于本人对http协议以及dns对url的解析问题并不了解,所以这里之探讨url请 ...
- 阿里签名中URLEncode于C#URLEncod不同之处
问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...
- Web Api 入门实战 (快速入门+工具使用+不依赖IIS)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...
- Java 输出流中的flush方法
转自:http://blog.csdn.net/jiyangsb/article/details/50984440 java中的IO流中的输出流一般都有flush这个操作,这个操作的作用是强制将缓存中 ...
- 使用Zabbix监控Oracle数据库
Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...
- 创建APPID&&部署服务端教程
创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输 ...
- iOS--->微信支付小结
iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...