首先,要先在这里分享一下我的喜悦,从昨天开始其实一直都在喜悦当中的,我收到了我的第一份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. json知识点总结(一)--基础介绍

    前言 JSON是一种轻量化的数据编码方式它不依赖于编程语言是独立的文本格式.和xml相比JSON具有格式简洁,转译速度快的特点,因此现在被广泛使用.JSON的本质是字符串,采用了特定的分隔方式对字符串 ...

  2. 项目可以怎么规范Git commit ?

    通常情况下,commit message应该清晰明了,说明本次提交的目的,具体做了什么操作.但是在日常开发中,大家的commit message都比较随意,中英文混合使用的情况有时候很常见,这就导致后 ...

  3. 由浅入深,带你用JavaScript实现响应式原理(Vue2、Vue3响应式原理)

    由浅入深,带你用JavaScript实现响应式原理 前言 为什么前端框架Vue能够做到响应式?当依赖数据发生变化时,会对页面进行自动更新,其原理还是在于对响应式数据的获取和设置进行了监听,一旦监听到数 ...

  4. 还在担心CC攻击? 让我们来了解它, 并尽可能将其拒之服务之外.

    还在担心CC攻击? 让我们来了解它, 并尽可能将其拒之服务之外. CC攻击是什么? 基本原理 CC原名为ChallengeCollapsar, 这种攻击通常是攻击者通过大量的代理机或者肉鸡给目标服务器 ...

  5. Linux C++ 实现一个简易版的ping (也就是imcp协议)

    背景: 想实现一个在没外网的时候就自动重启路由器的功能. 又不想用ping命令,因为在代码里调用system("ping"); 可能会比较耗时,得单开线程.于是找了个实现ICMP协 ...

  6. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

    对. 因为equals()方法可以用开发者重写,hashCode()方法也可以由开发者来重写,因此它们是否相等并没有必然的关系. 如果对象要保存在HashSet或HashMap中,它们的equals( ...

  7. python 装饰器函数基础知识

    1.装饰器的本质--一个闭包函数 2.装饰器的功能--在不改变原函数及其调用方式情况下对原函数功能进行拓展 3.带参数和返回值的装饰器 def timer(func): @wraps(func) #使 ...

  8. Spring 框架中都用到了哪些设计模式?

    (1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例: (2)单例模式:Bean默认为单例模式. (3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB ...

  9. JVM内存模型小结

    JVM运行时的数据区域划分图如下,该图是JVM内存模型最主要的内容. 从图中可以看出来,JVM将内存主要划分为五个部分:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区.这些被划分为用途不 ...

  10. redis主从复制与哨兵高可用

    redis主从复制 话不多说,直接看案例: 环境准备, 主从规划 主节点:6380 从节点:6381.6382 运行3个redis数据库,达到 1主 2从的配置 #主库 6379.conf port ...