spm使用之三spm应用实例
spm 的init实际上是调用了grunt这个工具来实现一些交互式的提问和数据的获取.
看看npm就知道, npm有个命令叫init, 就是一样的交互式提问获取你要创建的nodejs的模块信息.
spm从这个角度一看就是抄袭npm的方式, 当然, 说抄袭难听了点, 叫借鉴吧, 也是, 秀才摸得, 我和尚难道摸不得?
spm init 这个命令, 实际上就是将 C:\Documents and Settings\Administrator\.spm\init\cmd\root 和 C:\Documents and Settings\Administrator\.spm\themes\cmd 文件夹下的文件, 通过在一些模板文件中替换掉一些在交互阶段得到的参数, 然后复制到你执行spm init 命令的模块目录里, 比如D:\projects\box 等等.
首先谈, 这个css和js引用的问题, 既然都已经用上seajs了, 那么最好还是到https://github.com/seajs/examples 下载几个例子下来学习.
解压缩 examples 到D:\Projects\. 然后进入D:\Projects\examples-master目录, 会发现如下目录结构:
.gitignore
app/
index.html
README.md
sea-modules/
static/
进入sea-modules, 有如下目录:
angular/
examples/
gallery/
jquery/
seajs/
再进入examples目录, 这里有hello, lucky等等seajs模块.
在这个目录下, 我们故伎重施, 还是重新创建box
- md box
- cd box
- spm init
- #挨个回答问题
- ...
- #完了之后
- spm doc watch 直接运行在本机8000端口
然后修改readme.md, 加入中文, 把文件转换为utf-8编码格式. 另外, js文件意思一样, 如果有中文, 都转换为utf-8编码格式.
好了, 下面就是应用的实例了.
实例从哪里来? 还是从 高富帅seajs使用示例及spm合并压缩工具露脸 http://www.zhangxinxu.com/wordpress/2012/07/seajs-node-nodejs-spm-npm/ 这篇文章中来吧.
因为作者个博客虽然介绍了怎么使用seajs, 但是没有同时介绍怎么使用spm来管理自己写的这个模块, 为了省事, 我把作者的这几个例子再演示一遍. 当然了, 东西还是放在我自己刚弄的box模块里. 我弄这个的主要目的是结合seajs来介绍spm的doc
1.半透明背景遮罩层
进入box模块, 打开src目录, 新建zhezhao.js, 名字就不叫overlay了, 因为overlay好像和seajs现有的一个模块overlay同名, 每次在调试的时候,我都怀疑seajs并没有加载我的overlay.js, 而是加载了seajs/还是aliceui?自己提供的overlay.js, 因为我在chrome调试的时候, 没有看到对我本地的overlay.js的http请求, 也许是没请求这个文件.
内容直接复制如下:
- define(function(require, exports, module) {
- // 模块代码
- });
然后再创建一个 elementCreate.js 的JavaScript文件,同样的套用,如下JavaScript代码:
- /**
- * 创建元素
- */
- define(function(require, exports) {
- exports.create = function(tagName, attr) {
- var element = null;
- if (typeof tagName === "string") {
- element = document.createElement(tagName);
- if (typeof attr === "object") {
- var keyAttr, keyStyle;
- for (keyAttr in attr) {
- if (keyAttr === "styles" && typeof attr[keyAttr] === "object") {
- // 样式们
- for (keyStyle in attr[keyAttr]) {
- element.style[keyStyle] = attr[keyAttr][keyStyle];
- if (keyStyle === "opacity" && window.innerWidth + "" == "undefined") {
- element.style.filter = "alpha(opacity="+ (attr[keyAttr][keyStyle] * 100) +")";
- }
- }
- } else {
- if (keyAttr === "class") {
- keyAttr = "className";
- }
- element[keyAttr] = attr["class"];
- }
- }
- }
- }
- return element;
- };
- });
注意, 最上面有中文, 所以, 最好马上转换为 utf-8编码格式.
回到zhezhao.js文件, 全部内容修改为:
- /**
- * 黑色半透明遮罩层
- */
- define(function(require, exports, module) {
- var elementCreate = require("./elementCreate");
- var tanchu = (function() {
- var element = elementCreate.create("div", {
- styles: {
- display: "none",
- width: "100%",
- backgroundColor: "#000",
- opacity: 0.35,
- position: "absolute",
- zIndex: 1,
- left: 0,
- top: 0,
- bottom: 0
- }
- });
- document.body.appendChild(element);
- return {
- display: false,
- show: function() {
- element.style.display = "block";
- this.display = true;
- return this;
- },
- hide: function() {
- element.style.display = "none";
- this.display = false;
- return this;
- }
- };
- })();
- exports.zhezhao=zhezhao
- });
同样转为utf-8编码格式.
然后就是演示这个半透明遮罩层了, 这个主要是用在弹出框的model对话框的背景用的.
好戏开始了, 修改box目录里的readme.md, 为什么要修改这呢? 因为这个才是spm doc的出彩之处, 在一对4个````符号的包裹下, spm doc 会将markdown格式的readme.md文件中的 ```` 代码 ````转换成2部分, 一部分就是你在html中看到的代码, 另一部分直接转换成html的一部分了, 所以才精彩, 好了, 修改readme.md 如下:
- # box
- ---
- 带边框和标题的标准区块。
- ---
- ## 演示文档
- <link type="text/css" rel="stylesheet" media="screen" href="src/box.css">
- ### 默认用法
- ````html
- <div class="ui-box">
- <div class="ui-box-head">
- <div class="ui-box-head-border">
- <h3 class="ui-box-head-title">区块标题</h3>
- </div>
- </div>
- <div class="ui-box-container"></div>
- </div>
- ````
- ---
- ## Usage
- It is very easy to use this module.
- ````html
- <div class="alice-box">
- <button id="button">点击toggle</button>
- </div>
- ````
- ```javascript
- var myOverlay = null;
- seajs.use("./zhezhao", function(zhezhao) {
- myOverlay = zhezhao.zhezhao;
- });
- document.getElementById("button").onclick = function() {
- myOverlay[myOverlay.display? "hide": "show"]();
- };
- ```
- ## Api等等
- Here is some details.细节
解释, ````html 表示是html, 下一行的内容直到````结束, 会同时显示代码和转换成真正的html
````javascript 后面的内容会显示为javascript( 重新编码过, 显示在html中, 并且会转换成html文件里真正可用的script, 两头加上<script>...</script>标签
解释完毕
把上面的内容保存, 并且转换为utf-8编码格式.
然后, 就是见证奇迹的时刻了. 噔噔噔, 刷新http://localhost:8000/ 然后会看到一个按钮
点击 toggle, 然后应该会有一个暗灰色的遮罩层.
结果是, 妈蛋, 点击了之后, 没有任何反应!!!!
这个时候, 真的是天怒人怨的时刻到了!
我查找了很多地方, 居然没有任何人解释这个问题, 甚至翻遍了spm自带的模板, 甚至想研究一下狗日的spm doc到底是怎么转换md文件中的css和js代码的, 无奈水平有限, 没找到, 但是让我发现 spm 自带的模板是可以修改的, 这个下回再说, 这里先解决这个javascript代码为什么没有自动转换为html可以用的代码这个问题.
相信你们也找不到答案, 所以我就不卖关子, 直接说了, 答案就是, box/readme.md中的javascript代码, spm doc不会转换它, 他只会转换box/examples/index.md 里的, 或者说是转换 box/examples/ 目录下的*.md文件中的javascript为可以使用的javascript, 这是我无意中发现的.
因此, 把上面的一段代码弄到 box/examples/index.md 先试试:
- # Demo
- ---
- ## Normal usage
- ````html
- <div class="alice-box">
- <button id="button">点击toggle</button>
- </div>
- ````
- ```javascript
- var myOverlay = null;
- seajs.use("./zhezhao", function(zhezhao) {
- myOverlay = zhezhao.zhezhao;
- });
- document.getElementById("button").onclick = function() {
- myOverlay[myOverlay.display? "hide": "show"]();
- };
- ```
然后保存并转换为utf-8编码格式, 接着, http://localhost:8000/ 这里的左边点击"演示", 就会进入到http://localhost:8000/examples/index.html
这个时候, 再点击toggle, 就会出现半透明遮罩层了.
实际上, 这次写这个文件的时候, 连box/examples/index.md 转换为 index.html的时候, 都没有正确的解析出html中可用的 javascript, 导致我怀疑我上次在examples目录中这么弄, 弄好了, 是不是在梦里实现的.
值得一提的是上次弄好的, 是因为俩个小地方,
1 是直接创建了zhezhao这个模块, 直接创建overlay好像不能加载overlay, 不知道是不是和现有的seajs模块同名的原因.
2 是将seajs.use('./zhezhao') 和seajs.use('zhezhao') , 来回切换, 终于是调试好了.
有时候, 你会想用seajs.use('http://localhost:8000/src/zhezhao')这种来尝试, 最关键的还是看html源码, 看看你的javascript是不是转义了, 按照spm doc的正确解析, 应该html中会有你在文档中写的javascript代码的2个形式, 一个是转义后的js, 另一个就是套了<script>标签的可以用的js. 只要这个出现了, 那么, 在完成你写好的模块的使用文档的同时, 你的演示用的例子也做好了.
所以, 这个才是spm管理模块的出色的地方, 也是我最喜欢的部分, 其余spm build , 创建压缩js, css文件等等, 已经不新鲜了, 不值得我再去为这个写点什么了.
------------------------------------
问题终于发现了, 是我自己上面没有按照4个````js代码的形式```` 来写这些js代码, 我只写了3个```, 因此, 错误怎么都找不到...
当然, 这也是今天的意外发现, 因为前几天没发现3个```的东西就只转义显示js, 不出现js. 而4个````就会同时出现你写的js代码的2个形式, 上面说了的.
这个问题解决之后, 我发现, 不仅仅 在演示页的 点击toggle可以用了, 连box首页的 点击 toggle也可以用了.
如下图:
有一个问题就是这个toggle按钮, 点击之后, 就跑到遮罩层的下面去了, 想再次点击, 就怎么都点不了了. 方法就是设置他的css,, 让他的z-index比遮罩层的z-index的值要大,
这里设置为3就行了.
打开, src/box.css
把这一句加上:
button{margin:1em; position:relative; z-index:3;}
保存,刷新,即可
其他的就不多写了.
反正spm配合seajs写模块的步骤就是:
md box
cd box
spm init
然后进入 box/src 文件夹, 按照CMD规范写好seajs模块
然后在readme.md中写好你的模块的文档, js用4个````符号包裹, 然后使用spm doc watch来查看和调试, 就可以再完成文档的同时, 也完成了示例. 一箭双雕, 还是很爽的.
当然, 我还有其他的例子, 还有spm模板的修改, 还有spm 结合aliceui来弄东西没有写, 而aliceui才是我最想关注的东西. 下回再续吧.
spm使用之三spm应用实例的更多相关文章
- seajs 和spm的使用简介
说实话, 前端开发是一个令人头痛的事情. nodejs出现了很久了, 一直不是很习惯用nodejs, 当初刚出来的时候, 就下载了express, 想搭建个网站, 结果不是我的菜, 愣是用的不习惯,也 ...
- Sea.js学习5——Sea.js的构建工具spm
如果项目遵循推荐的标准目录结构: foo-module/ |-- dist 存放构建好的文件 |-- src 存放 js.css 等源码 | |-- foo.js | `-- style.css `- ...
- seajs+spm之再研究
好久没有用seajs了,之前对spm也只是一知半解,这些天再次拿起来研究.谈谈我的认识与理解. 声明:本文不适合对seajs完全不了解的同学阅读.对于想知道seajs来龙去脉以及spm相关的同学&qu ...
- sea.js,spm学习
安装spm 下载sea.js 运行spm npm install spm@2.x -g npm install spm-build -g 下载sea.js git clone https://gith ...
- 转:seajs的spm使用摸索
~~~spm是基于nodejs的,打开nodejs命令行工具,npm install spm -g 进行spm的安装,过程很漫长 github上的官网不能访问 seajs自带的spm打包工具相关文档略 ...
- 全新ASP框架——IISNODE介绍
Asp是一门经典的动态网页编程语言,通常使用vbscript或者Jscript脚本来实现.一个好的框架,可以帮助您更加快速地使用Asp来完成您的网站开发任务.而Asp框架的终结者——IISNODE框架 ...
- db2配置、db和dbm
----start DB2 可以在四个不同层面配置: 一:系统环境变量(System Environment Variable) 系统环境变量用来配置DB2 的使用环境: 查看:set | grep ...
- 前端模块化开发之seaJs
了解后端语言的童鞋一定听过模块化开发的概念,比如java.python等后端语言都有自己的模块化特性,然而和后端语言相比,javascript还尚未实现模块化的功能,虽然之后的更高版本可能引入模块化开 ...
- RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)
继续上次的学习笔记,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我们先来看一个叫做SPP-net的网络架构. 一,SPP(空间金字塔池化,Spatial Pyramid Pool ...
随机推荐
- EF 命令
我们选VS中工具-库程序包管理器-程序包管理器控制台, 这时在VS底部会出现控制台 这时候我们要执行四个操作: 下载安装EF 到工程.PM> Install-Package EntityFram ...
- Python爬虫获取知乎图片
前段时间想抓点知乎问题中的图片,了解了下爬虫,发现还是Python的简单方便,于是做了点尝试. #coding=utf-8 import urllib import re def getHtml(ur ...
- Mybaitis配置总结
在mybatis-config.xml中配置分页插件,插件配置必须放在mapper前面 <plugins> <plugin interceptor="com.rrtong. ...
- Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群
Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群 >>>>>>>>>>>> ...
- 3G/4G网卡使用
整体架构: pppd call option & ----------↓---------- option脚本(设置PPP连接) ----------↓---------- chat脚本(进行 ...
- Android切换页面--setContentView
setContentView 一般切换页面,通过Intent,startActivity可以实现,但系统创建Activity是非常耗时的,如果对切换画面时间有要求,只能用setContentView在 ...
- Oracle学习【语句查询】
基本查询语句any和all不能单独使用,必须和比较符一起使用>any 大于最小的例如:select * from emp where sal >any(1000,2000);<any ...
- Jsoup解析HTML、加载文档等实例
一.引入jsoup的jar包:http://jsoup.org/download 补充:http://jsoup.org/apidocs/ Jsoup API 可以了解更详细的内容 二.Js ...
- Object-C添加方法
给实例变量添加getter方法: #import <Cocoa/Cocoa.h> @interface Photo:NSObject { NSString *caption; NSStri ...
- ios专题 - GCD(1)
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...