git+nodejs搭建web静态服务器

搭建web静态服务器

创建项目根目录(或者从github仓库clone)并创建node项目

初始化

执行此步骤前提条件为:
①有过项目,但是使用环境更改的,比如更换电脑等
②没有项目,但是有package.json文件的

ps:以上条件不满足者从头老老实实搭建项目结构+安装各种插件(下文)  
    满足条件的还需要两个js配置文件,请拉倒最下面附录!
  • npm init按默认要求敲击enter键

      - name[可修改]  
      - version [可修改]  
      - description[可不写]  
      - entry point[可不写]  
      - text command[暂时不写]  
      - git repository[git仓库地址]  
      - keywords[可不写]  
      - author[可不写]  
      - license[默认]
    

安装express包,属于项目依赖

  • npm install express --save
    成功标志:出现node_modules文件夹

安装gulp包,属于开发依赖

  • npm install gulp -g

取消默认扫描

此步骤针对webstorm以及类似的编译器:由于上传文件和检查代码过程中编译器会自动检索node_modules包,因为操作量巨大极可能导致编译器卡死甚至电脑死机现象,此步骤必点!
  • 在编译器中右击node_modules文件夹选择Mark Directory As Exclusion(取消自动扫描)

创建项目详细结构(从原本项目仓库clone者忽略这步骤)

  • 新建入口文件 server.js
  • 新建public/ 文件夹,用来存放静态文件css、js、img等
  • 新建views/ 文件夹,用来存放html文件
  • 新建routes/ 文件夹,用来存放路由文件[用来接受请求]
  • 新建 .gitignore文件[忽略不必要的上传]
    • node_modules/
    • .project
    • .idea/
    • *.exe
    • logs/
    • .vscode/
    • *.log
    • *.bak
    • ...
  • 新建stylus/ 文件夹,用来存放styl文件

gulp 基本操作

基本命令

  • gulp.task[创建一个任务]
  • gulp.src[获取要处理的文件或目录-待定匹配模式]
  • gulp.dest[处理后的文件输出]
  • gulp.watch[动态监听文件更改]

配置文件gulpfile.js[不可改,特定名称]

  • 引入gulp等所需模块或插件
  • 创建任务
  • 创建编译stylus 文件/压缩文件等等
  • 监听文件变更

安装所需插件

  • npm install gulp-stylus --save-dev安装stylus自动编译
  • npm install gulp-minify-css --save-dev安装css压缩插件
  • npm install gulp-uglify --save-dev安装js压缩插件
  • npm install gulp-nodemon --save-dev启动node插件,不需要每次手动去启动
  • npm install browser-sync --save-dev代理,自动刷新页面
  • 可能用到的git命令如下
    • git rm -r --cached<filename>停止git追踪指定文件夹或文件
    • git pull origin master获取远程仓库更新
    • mkdir<name>创建一个目录
    • ls查看当前目录下的文件及其目录
    • ls -a同上,包含隐藏文件
    • git init
    • git add .
    • git commit -m 'message'
    • git config --global user.email 'email'
    • git config --global user.name 'name'
    • git config --list
    • git status

Stylus

css预处理框架,使用表达式生成css
另外常用两款框架:
sass 最早最成熟的css预处理语言
less 受sass影响很大且使用css语法,易上手

手动编译

  • 通过cmd控制台进入到项目文件夹(不想吐槽win系统自带的控制台,推荐使用Git)
  • 执行命令
    stylus --compress styl所在文件夹目录
    compress:生成压缩版的css文件
    stylus --compress styl所在文件夹目录/ --out css文件夹目录
    输出到另一个css目录文件夹下
    css转换成styl文件:
    stylus --css css所在目录/css文佳全称 styl文件目录/styl文件全称
    ps:若输出到同一目录下的相同名称的styl文件,则不需要styl文件目录/styl文件全称

自动编译

以下步骤当项目静态服务器搭建好后应该已经执行完,不用去管

  • gulp安装
    cnpm install gulp -g
    gulp -v查看是否成功
  • 配置json文件
    进入项目根目录,新建package.json文件
  • 本地安装gulp插件
    cnpm install gulp --save-dev
    在根目录下出现node_modules/文件夹则代表安装成功
  • 安装gulp-stylus插件
    cnpm install gulp-stylus --save-dev
  • 新建gulpfile.js文件

Stylus语法

单行注释不会被编译到css中,而多行注释会被自动编译到css中

  • 去除原生css中的{}和:和;
    使用首行文字+换行缩进的格式,嵌套的标签继续前一级缩进
  • &符号:代表父级,h标签下的类名为h缩进后&.类名
  • 可以使用变量
    scolor = red
    以下所有需要使用红色的地方可直接使用scolor作为属性样式的颜色
  • @符号:可以计算数值
    height 800px
    width (@height/2)有运算符时必须加括号
    @引用会冒泡向上寻找离@最近的,直到父级为止
  • 当使用css3兼容性样式时,前缀样式可以用一个方法封装起来
    border-radius(val)
    使用时,调用border-radius(10px)
  • 迭代(循环遍历)
    for in
    包含边界:1..5 >>> 1 2 3 4 5
    不包含边界:1...5 >>> 1 2 3 4
```stylus
for row in 1..5
    tr:nth-child({row})
      height 10px*row
```
  • @import 引入外部文件
    @import'demo.css'写在.styl文档最顶端
    @import'demo'不加后缀默认为引入.styl文件
    @font-face 引入字体文件
    
    @font-face
        font-family myFont(自己取名)
        src url()
            url()
            url()                    
    PS:通常字体文件共4个,全部导入,为了满足不同的浏览器
    -------------------------------------------------
    @media 指定媒体类型
    
    @media
        all 所有类型
        screen 电脑屏幕
        print 打印机
    
    max-width  
    min-width
    [max-]device-width/device-height 设备宽度
    
    @media 关键词:  
    and/only 限定关键词/not  
    
    @media only screen and (min-width:800px){}
    当浏览器屏幕大于800px时所表现的样式,这行代码要写在整体样式后,不然会被覆盖
    -------------------------------------------------
    @keyframes myAnimate(自己取名)
        0%
            ...
        50%
            ...
        100%
            ...
        0%
            ...


附录

项目结构

若你使用的项目和我不同,为了实现自动编译和自动刷新效果,请在两个js文件里做更改

gulpfile.js

/**
 * Created by Administrator on 2017/01/04.
 */
var gulp = require('gulp');
var stylus = require('gulp-stylus');
// var minifycss = require('gulp-minify-css');
var uglify = require('gulp-uglify');
var nodemon = require('gulp-nodemon');
var browserSync = require('browser-sync').create();
var reload = browserSync.reload;
//编写一个编译stylus任务
gulp.task('stylus',function () {
    //stylus文件及其所有子目录的文件
    return gulp.src('./stylus/**/*.styl')
    //编译stylus文件
        .pipe(stylus())
        //输出stylus编译后的文件
        .pipe(gulp.dest('./public/css/'))
});
gulp.task('minifycss',['stylus'],function () {
    return gulp.src('./public/css/**/*.css')
        .pipe(minifycss())
        .pipe(gulp.dest('./public/mincss/'))
});
gulp.task('uglify',function () {
    return gulp.src('./public/js/**/*.js')
        .pipe(uglify())
        .pipe(gulp.dest('./public/minjs/'))
});
/*不用每次都启动app.js,只需要启动watcher任务即可*/
gulp.task('nodemon',function (nm) {
    var flag = false;
    return nodemon({
        script:'./server.js'
    }).on('start',function () {
        if(!flag){
            nm();
            flag = true;
        }
    })
});
gulp.task('browserSync',['nodemon'],function () {
    browserSync.init({
        proxy:{
            target:'http://127.0.0.1:16909'
        },
        files:['*'],
        port:9888,
        open:false
    })
});
//动态监听
gulp.task('watcher',['browserSync','stylus'],function () {
    gulp.watch('./stylus/**/*.styl',['stylus']);
    gulp.watch('./public/css/**/*.css').on('change',function () {
        reload();
    })
});

server.js

var path = require('path');
//引入express依赖模块,用来启动静态服务器
var express = require('express');
/*console.log(__dirname);*/
var proxy = require('http-proxy-middleware');
//实例化express
var app = express();
app.use('/api',proxy({
    target:'http://122.10.30.153:9901',
    pathRewrite:{
        '^/api':'/'
    }
}));
//指定访问页面路径
app.use('/',express.static(path.join(__dirname,'views')));
app.use('/public',express.static(path.join(__dirname,'public')));
//指定端口号,建议3000以上,回调函数可以不写
app.listen(16909,function (){
    console.log('server run at port 16909')
});

//模块导出
module.expotrs = app;

package.json

{
  "name": "h5",
  "version": "1.0.0",
  "description": "",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "yyf",
  "license": "ISC",
  "dependencies": {
    "express": "^4.14.0"
  },
  "devDependencies": {
    "browser-sync": "^2.18.6",
    "gulp": "^3.9.1",
    "gulp-nodemon": "^2.2.1",
    "gulp-stylus": "^2.6.0",
    "gulp-uglify": "^2.0.0",
    "http-proxy-middleware": "^0.17.3"
  }
}

<div class="time_updated">此文章最近更新与 2017-1-15 16:30:38</div>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容