首先,要先在这里分享一下我的喜悦,从昨天开始其实一直都在喜悦当中的,我收到了我的第一份offer,这感觉不摆了,比第一桶金都还舒服,虽然我还没收到第一桶金哈哈,不过offer都得了应该也快了。

今天的内容有点小多,容我慢慢道来

1.

首先我们看到包的管理配置文件以及下包慢的问题,在我们多人协作下,是不是要经常把自己的代码共享出去通过git、github之类的,那么我应该发现一个问题,一个项目文件,有30M大小,而代码只有区区2M左右的内存,剩余的都给谁了?都给了第三方包也就是node_modules里面的内容,所以为了轻量化,我们在共享代码的时候肯定是不能带node_modules这个文件夹的,把她扔进.gitignore文件里面忽略掉,那我们没有了第三方包的依赖怎么执行代码呢,第三方包肯定还是要的,没有怎么能行,我们有一个package.json的文件在这里面存放了安装的所有的第三方包的内容。

1.1

快速创建packagejson

只需要在项目的文件中执行node init -y

要注意一下,只能在英文目录下去创建这个文件,这里的英文是当前目录为英文,也就是上一级为中文都没的关系,然后就是当我们运行npm i安装第三方包的时候就会把信息给到这个json文件中,所以我们在安装前要先创建json文件。

1.2

dependencies节点

这是这个json里面的节点名,记录了npm安装了哪些包

1.3

既然我们没有包,又知道了所有需要的包名,那么怎么来一次性安装所有的包?

npm install或者i不添加包名即可安装所有的包

1.4

卸载包

npm uninstall 包名没有简写

1.5

devDependencies节点

这个节点也是保存的安装的包,有些包是我们在项目开发过程中才会用到,而有些包使我们开发上线都会用到的包,我们一般把前者放在devDependencies节点里面,把后者放在dependencies节点里面。

当然他也有特定的安装方式

npm i 包名 -D

2.

然后我们看到下包会慢的一些原因,是因为我们的npm的服务器是国外的,通过海底光缆传过来的数据当然慢,所以这个时候我们需要把npm的镜像服务器换掉,通过npm config set registry可以查看当前npm的服务器

再通过npm config set registry='淘宝或者腾讯的镜像地址'就可以设置过来了。

之所以粗略带过,是因为我们有简便方法,通过npm先安装一个nrm全局可用工具,全局就需要在包名后面添加一个-g

然后nrm ls 可查看当前可设置的服务器地址,再用nrm use 加这个服务器名字即可使用。

3.

包的分类

我们把包分为两大类,一个是项目包,就是被安装到node_modules里面的包,这里面又有开发依赖包放在devDependencies节点里面的和核心依赖包开发上线都用得到的,

二个是全局包,放在c盘目录下面的,安装的时候通过-g参数安装的。

注意一下:只有工具性质的包才有全局安装的必要,因为他们提供了终端的一些命令

3.1

i5ting_toc

可以把md文件转换为html的小工具,注意是工具,这个其实挺方便的,前面一直用的Markdownpad2。

怎么来使用呢?

i5ting_toc  -f  md文件路径 -o表示浏览器打开

3.2

一个规范包的结构必须要包含三个东西

①每个包必须是单独目录

②包的顶级目录下必须包含package.json

③packag.json必须包含name、version、main三个属性

接下来我们就来做一个 属于自己的包:要实现的功能就为:可以格式化日期、可以对html中的字符转义为特殊字符又转义回来。

首先要初始化包的基本结构,创建一个包的文件夹,里面放三个文件,index.js、package.json、README.md分别表示包入口文件、包的配置文件、包说明文档。

接下来在初始化package.json里面的内容,{name:使我们包的名字到时候npm网站上搜索也是这个名字,所以使用前先去网站看一下有没有重名的,

version:版本号,

main:入口文件,说明了我们的导入就为这个文件要注意一下,如果说外界导入的时候只是导入了一个目录,并不是这个js文件,那么node就会去找这个目录下的package.json里面的main再去找入口文件,

description:详细介绍,

keywords:关键字是一个数组,

license:开原许可协议}

接下来就是在index.js中定义三个功能的函数了 ,这里有一个很重要的概念,模块化,我们的格式化时间是不是需要一个函数,还要补零是不是又要一个函数,那么这两个函数可以放在一个单独的js文件里面,我们的html转为特殊字符、特殊字符返回html也需要一个单独的js文件,完成过后需要在各自的文件把函数放进exports里面,然后index.js导入两个js文件他此时得到的是一个放有这几个函数的对象,我们需要通过es6语法中的扩展运算法,给她解构出来,就只有逗号分隔的函数了,这里有点绕可以配合代码好好理解下。

// 1.格式化时间
function dateFormat(time) {
const date = new Date(time)
let y = date.getFullYear()
let m = getZero(date.getMonth() + 1)
let d = getZero(date.getDate())
let h = getZero(date.getHours())
let mm = getZero(date.getMinutes())
let s = getZero(date.getSeconds())
return `${y}-${m}-${d} ${h}:${mm}:${s}`
} // 2.补零函数
function getZero(n) {
return n < 10 ? '0' + n : n
}
// 6.1共享成员
module.exports = {
dateFormat
}
// 4.html转义函数
function getHtmlCode(htmlStr) {
return htmlStr.replace(/<|>|"|&/g, match => {
switch(match) {
case '<':
return '&lt;'
case '>':
return '&gt;'
case '"':
return '&quot;'
case '&':
return '&amp;'
}
})
}
// 5.还原html
function getHtml(htmlStr) {
return htmlStr.replace(/&lt;|&gt;|&quot;|&amp;/g, match => {
switch(match) {
case '&lt;':
return '<'
case '&gt;':
return '>'
case '&quot;':
return '"'
case '&amp;':
return '&'
}
})
} // 6.2共享成员
module.exports = {
getHtmlCode,
getHtml
}
index.js
// 6.3 导入
const date = require('./src/dateFormat')
const strEscape = require('./src/strEscape') // 3.共享成员
module.exports = {
...date,
...strEscape
}

test.js

const bag = require('./index')
console.log(bag.dateFormat(new Date()));
console.log(bag.getHtmlCode('<h2>我是一个大温柔"嘻嘻"ss&</h2>'));
console.log(bag.getHtml('&lt;h2&gt;我是一个大温柔&quot;嘻嘻&quot;ss&amp;&lt;/h2&gt;'));

3.3

我们继续看到怎么来编写包的说明文档,就是把包的作用以及用法,注意事项说明清楚即可

## 安装
```
npm i mybag-huang
```
## 导入
```js
const mybag = require('mybag-huang')
```
## 格式化时间
```js
const time = mybag.dateFormat(new Date())
```
## 转义html代码中的特殊字符
```js
 mybag.getHtmlCode('<h2>我是一个大温柔"嘻嘻"ss&</h2>')
 ```
 ## 转义html代码中的正常字符
 ```js
 mybag.getHtml('&lt;h2&gt;我是一个大温柔&quot;嘻嘻&quot;ss&amp;&lt;/h2&gt;')
```
## 开源协议
ISC
3.4
发布包
首先注册npm账号,然后登陆 账号是在终端上登录:npm login
然后到所处的包的 目录下 npm pbulish既可以发布在npm网站上,但是要注意一下,需要切回到官方的服务器才能够发布成功。
删除已发布的包npm unpublish 包名 --force 只能删除发布后72小时内的包,删除后二十四小时内不可再发布相同的包
4.
模块加载机制
我们的模块都是优先从缓存当中来加载的,当我们导入过后就会第一时间加载在缓存中,所以导入相同的文件不管你导入多少次,都是加载的第一个文件。
内置模块的加载机制
内置模块加载的优先级最高,比如说内置模块和我们的自定义模块如果名字一样,那么导入的时候是认为这是一个内置模块的。
自定义模块的加载机制
require里面的文件必须以./或者../开头不然就会被当为内置或者第三方模块。
如果说省略了扩展名,那么node会依次开始查找js、json、node的文件扩展名都没有找到就会报错。
第三方模块的加载机制
require不是内置模块也不是,/开头那么就会从当前目录的modules文件夹里面开始照这个第三方模块而且没找到的话会继续往上一级找,直到找到根目录为止。
当你把目录作为require的路径时,会首先去找package里面的main如果没有指定,就会加载当前目录下的index.js都没有就会报错。
 
5.
express
5.1
首先什么叫做express
他和http内置模块相同,专门创建web服务器的
5.2
基本使用
1.安装
npm i express
2.创建web服务器
①导入express
②创建服务器
const app = express()
③diaoyong
app.listen(端口号,回调函数)
3.
监听get、post
app.get/post(url,回调函数)
// 1.导入
const express = require('express')
// 2.创建服务器
const app = express() // 4.监听客户端的get和post请求并响应
app.get('/index.html ', (req, res) => {
res.send({
"name" : "zs",
"sex" : "男",
"age" : 19
})
})
app.post('/index', (req, res) => res.send('post成功'))
// 3.开启服务器
app.listen(80, () => {
console.log(
'express server running at http://127.0.0.1'
)
})

4

获取url中的参数

通过req.query获得一个对象保存的参数

const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send(req.query)
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
})

获取url当中的动态参数

req.params

const express = require('express')
const app = express()
app.get('/:id', (req, res) => {
console.log(req.params);
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
})

5.3

托管静态资源

express.static()这个方法可以创建静态服务器的时候,将文件目录下的css、图片、js等共享出去对外开放。

app.use(express.static('文件夹'))要注意一点对谁开放那么这个目录是不会出现在url路径当中的

const express = require('express')
const app = express() app.use(express.static('./clock')) app.listen(80, () => console.log('express server running at http://127.0.0.1'))

如果要托管多个目录就把代码执行多次即可,但是要注意如果访问的文件名有几个目录都有的话,会按照顺序执行前面的。

挂在路径前缀

const express = require('express')
const app = express() app.use('/abc',express.static('./clock')) app.listen(80, () => console.log('express server running at http://127.0.0.1'))

5.4

今天最后的内容更新一个很实用的小工具,nodemon直接全局安装,他的作用就是我们平时改了一下代码,比如服务器必须重新断开重新连接,才会看到效果就会很麻烦,而有了这个工具后直接执行nodemon 文件名他就会检测到我们的代码修改情况自动去重新启动,就跟我们html的live一样

node.js - 包、express的更多相关文章

  1. Node.js包管理器:

    Node.js包管理器: 当我们要把某个包作为工程运行的一部分时,通过本地模式获取,如果要在命令行下使用,则使用全局模式安装 使用全局模式安装的包并不能直接在JavaScript文件中用require ...

  2. Node.js系列-express(上)

    前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...

  3. 9.Node.js 包管理器npm

    npm 是 Node.js  官方提供的包管理工具, 用于 Node.js包的发布.传播.依赖控制 安装 express ==> 流行的基于Node.js的Web开发框架,可以快速地搭建一个完整 ...

  4. 《Node.js 包教不包会》

    <Node.js 包教不包会> 为何写作此课程 在 CNode(https://cnodejs.org/) 混了那么久,解答了不少 Node.js 初学者们的问题.回头想想,那些问题所需要 ...

  5. 如何设计一个基于Node.js和Express的网站架构?

    前言 今年七月份,我和几个小伙伴们合伙建立了一个开发团队.业务开展如火如荼的同时,团队宣传就提上了日程,所以迫切需要搭建公司网站出来.确定目标后我们就开始考虑如果构建一个企业网站.先是进行业内调查,看 ...

  6. Node.js包管理器Yarn的入门介绍与安装

    FAST, RELIABLE, AND SECURE DEPENDENCY MANAGEMENT. 就在昨天, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm .咱 ...

  7. Node.js、express、mongodb 实现分页查询、条件搜索

    前言 在上一篇Node.js.express.mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询.带条件搜索. 实现效果 1.列表第一页. 2.列表第二页 3. ...

  8. Node.js、express、mongodb 入门(基于easyui datagrid增删改查)

    前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...

  9. node.js和express.js安装和使用步骤 [windows]

    PS: NODEJS:https://nodejs.org NPM:https://www.npmjs.com/ 一.node.js安装与配置 到https://nodejs.org/en/downl ...

  10. Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...

随机推荐

  1. eclipse中的项目如何打成war包

    war包即Web归档文件,将Web项目打成war包可以直接拷贝到Web服务器发布目录(例如Tomcat服务器webapps目录 ),当Tomcat启动后该压缩文件自动解压,war包方便了web工程的发 ...

  2. 企业应用架构研究系列二:MSF&Scrum 项目管理

    从业软件项目这么多年,在企业应用开发项目中,项目能否成功,是否能按照项目计划有效的推进,是有很强的一套项目管理理论.最早的时候,接触的项目管理的方法论就是微软的MSF(Microsoft Soluti ...

  3. Collection框架中实现比较要实现什么接口?

    Java集合框架中需要比较大小的集合包括TreeMap.TreeSet,其中TreeMap会根据key-value对中key的大小进行排序,而TreeSet则会对集合元素进行排序. 因此TreeMap ...

  4. SpringMvc怎么和AJAX相互调用的?

    通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象.具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法 ...

  5. 面试问题之C++语言:Overload、Override及Overwirte的区别

    Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载. 特点: (1)相同的范围(在同一个类中) (2)函数名 ...

  6. js技术之拖动table标签

    一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...

  7. [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助.一.main()函数参数通常我们在写主函数时都是void ...

  8. 用vue开发一个猫眼电影web app

    前言:之前一直在学习原生的javascript,但是无奈功力太浅,学了很长时候也只能写一些简单的小demo,知道遇见了vue,一切都变了,他的双向绑定和组件化思想让我迅速的爱上了他,可是光学不练是没有 ...

  9. android 布局的android:padding 和android:margin的区别

    android:layout_marginLeft指该控件距离边父控件的边距, android:paddingLeft指该控件内部内容,如文本距离该控件的边距. 如: 当按钮分别设置以上两个属性时,得 ...

  10. dva+react+antd+webpack 项目开发配置

    如何搭建一个dva项目如何搭建一个dva项目 后期项目会在github上进行书写,同时也会在segmentfault上进行同步-3Q拜读-