设为首页 收藏本站
查看: 886|回复: 0

[经验分享] Express4 启航指南

[复制链接]

尚未签到

发表于 2017-2-23 12:05:15 | 显示全部楼层 |阅读模式
     确实有感而发,Nodejs真的发展太快了,这么说的原因有两点:自己去年冬天买了本《了不起的Node.js》,里面介绍Express的版本还是2.x.x;前些天小伙伴买了本《Node.js实战》,结果依赖的Express是3.x.x。尼玛如果安装目前新版的Express4,那么这些书中的例子连项目都无法正常跑起来。

    Nodejs相关的纸版书一上市就已经过时了!

     DSC0000.jpg
    此文的背景是由于俺某天手欠,升级了最新Express V4+后,发现项目不可用了(还好是公司内部的小工具),查找资料后整理了些许总结,介绍如何使用Express4搭建项目。 
    情况差不多就是这样,那么咱们"深入浅出"一把Express项目吧。
     DSC0001.jpg
    如果看官想了解Express 4之前的安装、使用可查看:http://www.cnblogs.com/Darren_code/p/node_express.html
  
  --------------------------- 分割线 ---------------------------
  



目录


  • 建立工程环境
  • npm安装细节
  • 全局模式安装的意义
  • 创建项目
  • 目录结构


  • 配置文件之神奇的package.json
  
  

建立工程环境

    先介绍下各种环境吧:
     DSC0002.jpg
  
    进入俺们的项目所在目录:



  cd /home/work/node/project
  
    npm安装express , -g 指令让express进入全局安装:



  $ npm install -g express
  
    如果是express 4.0之前版本,那么执行“express -V”就可以得到版本号了,可express 4.0之后还需要再安装express-generator包,如果没有安装还执行“express -V”命令会报错。
  
    执行安装express-generator包:



  $ npm install -g express-generator
   
    现在执行“$ express -V”可查看express版本信息了。
    
  
    发生这种情况的原因是,express4.0之后把创建一个APP的功能分离出来为express-generator,没它你创建不了应用程序。
  
  

NPM和模块

    以下两张express目录(安装samba,Windows下查看无压力)的图片可以更直观的对比express包的变化,下图左侧是V3.15.0,下图右侧是V4.7.0:
      
  
    目录结构上看就缺少一个bin文件,这个bin目录内存放的就是内部命令(下图),只不过它们都是以独立的文件形式存在的。
    PS:bin是binary的缩写,有关bin和sbin目录的含义需要看官对linux的目录结构有一点点了解,使用Google 百度一下"linux 目录"即可找到对应资料。
    
  
    再从模块信息(node_modules/express/package.json)看它们的重要不同:



  "bin": {
       "express": "./bin/express"
  }
  
    需要注意npm模块中的信息都在package.json里面,包括各种配置信息。
    其中"bin"这个key就是申明用户可以使用“command-name”这个命令,而输入该命令后就会去执行“command-file”这个文件。如下:



  {
       ...
      "bin": {
            "command-name” : “command-file”
      }
      ...
  }
  
    所以在命令行输入express命令时,其实对应的其实是去执行bin目录下的express程序。
    如果自己要制作模块包,且希望可以命令行工具使用时,需要配置好bin字段,当全局模式安装之后就可以在命令行直接执行使用。有关package.json的信息会再配置章节中再详细介绍,"$ npm help json"可以获取官方的详细信息。
  
  


全局模式安装的意义
    npm安装的时候区分本地模式安装和全局模式安装,“-g”就表示全局模式安装,这种模式会被安装在node安装目录的lib所在目录的node_modules文件夹中,全局使用。
  
    NPM是由Isaac Z.Schlueter创建的,提供给Node服务的Node包管理器,最开始需要独立安装,后来当Nodev0.6.3版本默认集成了NPM作为Node包管理器,所以在那之后,只要使用NPM安装的全局包地址,都可以推算出来。
    如Node在/usr/local/bin/node,那么模块目录就是/usr/local/lib/node_modules/下。
    非全局那么就是本地模式安装,这类模式安装会被安装在当前目录的node_modules文件夹中,非全局使用。
  
    如果express-generator不是全局模式安装怎么办?
    非常不爽的就是命令行工具中直接使用"express [option] [dir]"就没法完成了,只能手动的找到执行文件执行才可以,如本地模式安装的时只能只能在当前目录下执行



  $ ./node_modules/express-generator/bin/express -V
  4.2.0
  
  

创建项目

    东扯西扯完毕,各方面也已经Ready,创建个Express项目开心一下:)
    再确认一下所在的目录位置
    
  
    express myapp
    
    $ cd myapp && npm install
  
    npm install完成之后就可以run起来咯,执行:



  $ DEBUG=myapp ./bin/www
  
    执行“npm start”其效果一样,下图分别是这两条语句执行情况:
    
    
    PS:红框中的内容是访问时打印的信息。
    
    可以看到俩条命令打印出来的信息有一行不一样,执行完“DEBUG=myapp ./bin/www”后会打印出:“myapp Express server listening on port 8898 +0ms”
  
    让俺们来看看为神马,执行命令:



  $ vi ./bin/www
    
    PS:默认PORT其实3000(红框中的部分),俺手动修改后使用的是8898端口
  
    Express4中引入了著名的debug模块,所以debug模式让我们更方便的玩转Node中的模块,其使用方法介绍起来较长,建议大家看看其官方的介绍:https://www.npmjs.org/package/debug
  
    重要的package.json文件马上会介绍,创建Express4项目俺们就说到这里。
  
  

目录结构
     了解目录结构是玩转一切项目的第一步:
    


  • app.js,程序启动文件
  • bin,创建项目时已经提到,是真实的执行程序
  • node_modules, 存放所有的项目依赖库

  • package.json,项目依赖配置及开发者信息
  • public,静态文件(css,js,img)

  • routes,路由文件

  • views,页面文件

  
  

配置文件之神奇的package.json
    在Nodejs项目中,package.json文件用来声明项目基本信息和使用的模块,这样在新的环境部署时,只要在package.json文件所在的目录执行npm install命令即可按照所需要的模块啦。
    下面俺们通过这个package.json文件再Build Express项目玩玩(生命不息折腾不止嘛)。
  
    回到project目录:
    
    在project目录下新加testpackage项目



  $ mkdir testpackage && cd testpackage
    
    把myapp中的package.json copy过来



  $ cp ../myapp/package.json ./
    
    创建个server.js,写入简单的几行代码,运行一把:



  var express =  require('express');                                                                     
  var app = express();                                                                                 
  app.get('/', function(req, res){                                                                     
      res.send('Hello World');                                                                          
  });                                                                                                   
  var server = app.listen(8808, function() {                                                            
      console.log('Listening on port %d', server.address().port);                                       
  });
  app.get('/sayhi', function(req, res){                                                                                                                                       
  res.send('狗狗 黑喂狗');                                                                          
  });

    
    上面俩图就是运行结果。
  
    查看package.json中的内容如下
    
    会议下由package.json实现的快速项目搭建,俺们再来了解其内容意义:


  • name
    ~ 在package.json中最重要的就是name和version字段。他们都是必须的,如果没有就无法install;
    ~ 想好名字之前先去npm registry查看一下这个名字是否已经被使用了,http://registry.npmjs.org/

  • version
    ~ version必须能被 node-semver解析,它被包在npm的依赖中;
    ~ name和version一起组成的标识在假设中是唯一的。改变包应该同时改变version
  • private
    ~ 如果你设置"private": true,npm就不会发布它;
    ~ 这是一个防止意外发布私有库的方式。如果你要确定给定的包是只发布在特定registry(如内部registry)的,用publishConfighash的描述来重写registry的publish-time配置参数

  • scripts
    ~ “scripts”是一个由脚本命令组成的hash对象,他们在包不同的生命周期中被执行。key是生命周期事件,value是要运行的命令。
  • dependencies
    ~ 依赖是给一组包名指定版本范围的一个hash。这个版本范围是一个由一个或多个空格分隔的字符串。依赖还可以用tarball或者git URL
    以上五项仅仅是Express4 package.json使用的,其他细节可参考文档 传送门https://www.npmjs.org/doc/files/package.json.html

小结一下
    文章在偏应用的层面上介绍了NPM和模块信息,希望能对大家了解有所帮忙吧。
    8月份的文章补上,俺们下一章再来介绍用Express+mongodb搭建个人网站,保佑老子千万别跳票了...吼吼:)

    
    
    资料


  • http://expressjs.com
  • http://www.npmjs.com/
  • (英语)https://www.npmjs.org/doc/files/package.json.html
  • (中文)http://mujiang.info/translation/npmjs/files/package.json.html
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346230-1-1.html 上篇帖子: js模块化开发---js大项目代码组织和多人协作的解决之道 下篇帖子: 2015校园招聘阿里巴巴前端笔经面经
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表