Node.js
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0; text-align: center" align="center"><strong><span style="font-family: "Times New Roman"; font-size: 24pt">Node.js</span></strong></p><p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> <img src="https://img2020.cnblogs.com/blog/1172834/202009/1172834-20200924115434303-1822092562.jpg" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"></span></p>
<p> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js不是JS文件,也不是一个JS框架,而是Server side JavaScript runtime,服务器的一个JS运行时</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js是一个基于Chrome v8 引擎的JavaScript运行环境</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js使用了一个事件驱动、非阻塞式的I/O模型,使其轻量又高效。</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js的包管理器nmp,是全球最大的开源库生态系统</span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">NVM</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Nodejs下载安装[不建议]</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">NPM</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">NPM镜像</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">cnpm</span></p>
<p class="MsoNormal" style="margin-left: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">启用交互解释器</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">nrm</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Nodesjs由哪几部分组成</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">事件循环</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">事件驱动程序</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">EventEmitter</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">NVM</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Nodejs的版本管理工具(Node Version Manager),由于Nodejs迭代速度特别快,不同的项目可能需要不同的版本,NVP就类似Python中Anaconda?可以管理不同的Python版本?</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">nvm可以很方便管理node的版本</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">npm可以很方便的管理node所需包</span></p>
<p class="MsoNormal"><img src="https://img2020.cnblogs.com/blog/1172834/202008/1172834-20200810103252115-503696851.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">windows:</span><span style="text-decoration: underline"><span style="font-family: "Times New Roman"; color: rgba(0, 56, 132, 1); font-size: 10.5pt">https://github.com/coreybutler/nvm-windows/releases</span></span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(57, 57, 57, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">下载</span>zip文件即可</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(57, 57, 57, 1); font-size: 10.5pt">linux:</span><span style="text-decoration: underline"><span style="font-family: "Times New Roman"; color: rgba(0, 56, 132, 1); font-size: 10.5pt">https://github.com/creationix/nvm</span></span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(57, 57, 57, 1); font-size: 10.5pt">简单使用:</span><span style="text-decoration: underline"><span style="font-family: "Times New Roman"; color: rgba(0, 56, 132, 1); font-size: 10.5pt">https://www.jianshu.com/p/8671e439a811</span></span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">配置淘宝镜像:</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">由于</span>nvm下载node时太慢,我们在其中添加淘宝镜像</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">windows在nvm安装包下的settings文件下配置如下:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">root: D:\nvm_setup\nvm
path: D:\nvm_setup\nodejs
arch:</span>64<span style="color: rgba(0, 0, 0, 1)">
proxy:none
node_mirror: https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">npm.taobao.org/mirrors/node/</span>
npm_mirror: https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">npm.taobao.org/mirrors/npm/</span></pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">linux配置nvm下载node环境的镜像</span></p>
<div class="cnblogs_code">
<pre>-<span style="color: rgba(0, 0, 0, 1)"> 在用户环境变量下加入,激活
export NVM_NODEJS_ORG_MIRROR</span>=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">npm.taobao.org/mirrors/node</span>
-<span style="color: rgba(0, 0, 0, 1)"> 配置node环境的npm镜像
</span>-<span style="color: rgba(0, 0, 0, 1)"> 打印默认的 registry 地址
npm config </span>-<span style="color: rgba(0, 0, 0, 1)">g get registry
# https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">registry.npmjs.org/</span>
-<span style="color: rgba(0, 0, 0, 1)"> 设置淘宝镜像
npm config </span>-g set registry https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">registry.npm.taobao.org</span>
</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">下载</span>node:</span></p>
<div class="cnblogs_code">
<pre>nvm install v7.9.0#命令后加版本号就可以进行安装,字母v可以不写,如下图</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">卸载:</span></p>
<div class="cnblogs_code">
<pre>nvm uninstall v7.9.0</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">查看当前正在使用的</span>node版本:</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">首先启动</span>nvm,不启动nvm在控制台输入node会报node不是内部或外部命令。</span></p>
<div class="cnblogs_code">
<pre>nvm on # 输入后会打印nvm已启动,并且显示当前正在使用的版本</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">关闭</span>nvm:</span></p>
<div class="cnblogs_code">
<pre>nvm off # 关闭nvm后,系统就会屏蔽对node的使用</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">切换</span>node版本:</span></p>
<div class="cnblogs_code">
<pre>nvm use v7.8.0</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">Nodejs下载安装[不建议]</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">建议使用</span>nvm去安装(nvm install node版本号)!</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">傻瓜式安装</span>-安装后命令行输入:path,可以查看到安装过程中已经将nodejs路径加入了path中</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">NPM</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">由于</span>node是亲内核的,本事没有这么多功能,但是有很多包,但是包和包直接存在依赖,我们需要一个工具帮我们管理包。这就需要使用NPM了。</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">类似</span>java的maven,是随同Nodejs一起安装的包管理工具,能解决Nodejs代码部署上的很多问题。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">使用场景</span></strong><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">:</span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">允许用户从</span>NPM服务器下载别人编写的第三方包到本地使用。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">允许用户从</span>NPM服务器下载并安装别人编写的命令行程序到本地使用。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">允许用户将自己编写的包或命令行程序上传到</span>NPM服务器供别人使用。</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">注意:新版的</span>nodejs已经集成了npm,输入npm -v即可查看是否安装成功。</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">配置</span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">window下修改npm安装包的全局路径(类似于maven的setting文件中安装包的全局路径),新建</span><strong><span style="font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">.npmrc</span></strong><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">文件,内容如下:</span></p>
<div class="cnblogs_code">
<pre>cache=E:\nvm-<span style="color: rgba(0, 0, 0, 1)">setup\npm\cache
prefix</span>=E:\nvm-setup\npm\repository</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">cache表示缓存目录,prefix表示npm包安装目录。然后将该文件丢到user/admin目录下。然后判断是否设置成功:命令行:</span></p>
<div class="cnblogs_code">
<pre>npm config list</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">如果打印出自己所配置的内容,就代表设置成功。以后在使用</span>npm install -g <package modul>安装全局包时就会安装在这个配置的目录下(-g:global)。</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">然后将</span>prefix对应的目录设置到环境变量中。</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">常用命令</span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">windows下安装/升级npm:</span></p>
<div class="cnblogs_code">
<pre>npm install npm -g</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">linux下升级/安装</span></p>
<div class="cnblogs_code">
<pre>sudo npm install npm -g</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">使用</span>npm安装模块:</span></p>
<div class="cnblogs_code">
<pre>npm install <Module Name>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @版本号下载对应版本号的模块</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> --save 保存到package文件。如果有了package文件,打包项目可以直接删除node_modules模块,当别人使用时,可以直接在项目中使用nmp install命令自动读取package.json,生成新的node_modules模块。其实就是在package.json里添加了这个模块的依赖。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> --save-dev 表示在开发环境下使用</span></pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">何为开发依赖?何为项目依赖?</span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">npm提供了一些工具包:gulp,我们自己做的东西跟他没关系,但是开发时候需要用到,gulp就属于开发阶段的依赖。boostrap,我们做的页面用到了这个包,bootstrap就是任何环节都依赖,这是项目依赖。当生成package文件的时候,将项目打包给别人的时候(没有node_modules),别人会通过npm install初始化package中所需要的包,这时候不会去安装开发依赖所需要的包】</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">例如:使用</span>npm 安装常用的Nodejs web框架模块express</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">npm install express</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">安装好之后,</span>express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">其类似于</span>maven ,也会将依赖的包一起添加进来。</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">全局安装与本地安装</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">类似</span>java maven的全局库与本地库吧。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> npm install express # 本地安装
npm install express </span>-g # 全局安装</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">如果出现错误:</span></p>
<div class="cnblogs_code">
<pre>npm err! Error: connect ECONNREFUSED 127.0.0.1:8087 </pre>
</div>
<p> </p>
<p class="MsoNormal" style="line-height: 111%"><span style="font-family: "Times New Roman"; line-height: 111%; font-size: 9pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial"><span style="font-family: "Times New Roman"">解决办法:</span></span></p>
<div class="cnblogs_code">
<pre>$ npm config set proxy <span style="color: rgba(0, 0, 255, 1)">null</span>
</pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">本地安装</span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">将安装包放在</span> ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">可以通过</span> require() 来引入本地安装的包。</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">全局安装</span></strong></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">将安装包放在</span> /usr/local 下或者你 node 的安装目录。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"> <span style="font-family: "Times New Roman"">可以直接在命令行里使用。</span></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">如果你希望具备两者功能,则需要在两个地方安装它或使用</span> npm link。</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">查看安装信息:</span></strong></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">npm list -g</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">查看某个模块的版本号:</span>npm list 模块名</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="text-indent: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">使用</span>package.json</span></strong></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">package.json 位于</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt">模块</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">的目录下,用于定义包的属性。</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">例如上面安装的</span>express模块:【node_modules/express目录下】</span></p>
<p class="MsoNormal"><img src="https://img2020.cnblogs.com/blog/1172834/202008/1172834-20200810103555121-894468685.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">卸载模块、更新模块、搜索模块</span></strong></p>
<div class="cnblogs_code">
<pre>npm uninstall <Module Name><span style="color: rgba(0, 0, 0, 1)">
npm update </span><Module Name><span style="color: rgba(0, 0, 0, 1)">
npm search </span><Module Name></pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 10.5pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">创建模块</span></strong></p>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">创建模块,</span>package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 63pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">项目根目录下执行</span></p>
<div class="cnblogs_code">
<pre>npm init</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">然后根据提示输入你要创建模块的信息,最后</span>yes,生成的package.json就在项目的根目录下。(使用npm init --yes可生成默认的package.json文件)</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-left: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">注册</span>npm资源库【username:liuwei04 password:常用密码之一 邮箱:qq邮箱】</span></p>
<div class="cnblogs_code">
<pre>npm adduser</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt; mso-list: l0 level1 lfo1"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">发布自己的模块</span></p>
<div class="cnblogs_code">
<pre>npm publish</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">如果你以上的步骤都操作正确,你就可以跟其他模块一样使用</span> npm 来安装。先创建自己的模块,然后发布到远程npm库上,再用时就使用npm install yourpackageName【要先npm login】</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">NPM镜像</span></strong></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0; text-indent: 21pt"><strong><span style="font-family: "Times New Roman"; font-size: 15pt">cnpm</span></strong></p>
<div class="cnblogs_code">
<pre>npm install -g cnpm --registry=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">registry.npm.taobao.org</span></pre>
</div>
<p> </p>
<p class="MsoNormal"><img src="https://img2020.cnblogs.com/blog/1172834/202008/1172834-20200810103656909-1594673501.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0; text-indent: 42pt"><strong><span style="font-family: "Times New Roman"; font-size: 12pt">启用交互解释器</span></strong></p>
<div class="cnblogs_code">
<pre>npm</pre>
</div>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">类似</span>windows/linux终端,或者mongoDB的终端【mongo.exe】</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0; text-indent: 21pt"><strong><span style="font-family: "Times New Roman"; font-size: 15pt">nrm</span></strong></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">nrm的作用:提供了一些最常用的NPM包</span><strong><span style="font-family: "Times New Roman"; font-size: 10.5pt">镜像地址</span></strong><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">,能够让我们快速的切换安装包时候的服务器地址;</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">什么是镜像:原来包刚一开始是只存在于国外的</span>NPM服务器,但是由于网络原由,经常访问不到,这时候,我们可以在国内,创建一个和官网一样的NPM服务器,只不过,数据都是从人家那里拿过来,除此之外,使用方式完全一样;</span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">1、运行:</span></p>
<div class="cnblogs_code">
<pre>npm i nrm -g # 全局安装nrm包</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">2、使用:</span></p>
<div class="cnblogs_code">
<pre>nrm ls # 查看当前所有可用的镜像源地址以及当前所使用的镜像源地址</pre>
</div>
<p> </p>
<p class="MsoNormal" style="text-indent: 42pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">3、使用:</span></p>
<div class="cnblogs_code">
<pre>nrm use npm 或 nrm use taobao # 切换不同的源地址</pre>
</div>
<p class="MsoNormal" style="text-indent: 42pt"> </p>
<p class="MsoNormal" style="text-indent: 42pt"><strong><span style="font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">nrm只是提供不同的源地址</span></strong><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">,真正下载安装还是使用</span>npm命令去装,只是从nrm指定的镜像源里下载罢了。</span></p>
<p class="MsoNormal" style="text-indent: 42pt"> </p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">Nodesjs由哪几部分组成</span></strong></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">引入</span> required 模块:我们可以使用 require 指令来载入 Node.js 模块。【类似于java中的import】</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">创建服务器:服务器可以监听客户端的请求,类似于</span> Apache 、Nginx 等 HTTP 服务器。</span></p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-size: 10.5pt"> </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">接收请求与响应请求</span> 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。</span></p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">案例:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> http = require('http'<span style="color: rgba(0, 0, 0, 1)">);
http.createServer(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (request,response) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送HTTP头部</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">HTTP状态值:200:OK</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">内容类型:text/plain</span>
response.writeHead(200,{'Content-Type':'text/plain'<span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发送相应数据“Hello World”</span>
response.end("Hello World\n"<span style="color: rgba(0, 0, 0, 1)">);
}).listen(</span>8888<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">终端打印如下信息;</span>
console.log('Server running at http://127.0.0.1:8888/'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在server.js所在目录启动终端:运行node server.js,即可启动服务器</span></pre>
</div>
<p> </p>
<p class="MsoNormal"><span style="font-family: "Times New Roman"; font-weight: bold; font-size: 12pt"> </span><strong><span style="font-family: "Times New Roman"; font-size: 12pt">Nodejs回调函数</span></strong></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js 异步编程的直接体现就是回调。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt">异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">回调函数在完成任务后就会被调用,</span>Node 使用了大量的回调函数,</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt">Node 所有 API 都支持回调函数。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">例如,</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件</span> I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="font-family: "Times New Roman"; color: rgba(51, 51, 51, 1); font-size: 10pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial"><span style="font-family: "Times New Roman"">回调函数一般作为函数的最后一个参数出现:</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> foo1(name, age, callback) { }
</span><span style="color: rgba(0, 0, 255, 1)">function</span> foo2(value, callback1, callback2) { }</pre>
</div>
<p> </p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">事件循环</span></strong></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js 几乎每一个 API 都是支持回调函数的。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"> <span style="font-family: "Times New Roman"">基本上所有的事件机制都是用设计模式中观察者模式实现</span></span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">。</span></p>
<p class="MsoNormal" style="margin-left: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js </span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">单线程类似进入一个</span>while(true)的事件循环,直到没有事件观察者退出,</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">每个异步事件都生成一个事件观察者</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(230, 108, 0, 1); font-size: 10.5pt"><span style="font-family: "Times New Roman"">,如果有事件发生就调用该回调函数</span>.</span></p>
<p class="MsoNormal" style="margin-left: 42pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">事件驱动程序</span></strong></p>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">Node.js 使用事件驱动模型,当web server接收到请求,</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(223, 64, 42, 1); font-size: 10.5pt">就把它关闭</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; color: rgba(247, 117, 103, 1); font-size: 10.5pt">然后进行处理</span><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">,然后去服务下一个</span>web请求。</span></p>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。</span></p>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">这个模型非常高效可扩展性非常强,因为</span>webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)</span></p>
<p class="MsoNormal" style="text-indent: 63pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。</span></p>
<p class="MsoNormal"><img src="https://img2020.cnblogs.com/blog/1172834/202008/1172834-20200810103842547-164707204.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p class="MsoNormal"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"><br></span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><span style="font-family: "Times New Roman"">整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题</span>(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。</span></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: Calibri; font-size: 10.5pt"> </span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0"><strong><span style="font-family: "Times New Roman"; font-size: 21pt">EventEmitter</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。</span></p>
<p class="MsoNormal" style="margin-top: 0; margin-bottom: 0; text-align: center" align="center"> </p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt">功能的封装。</span></p>
<p class="MsoNormal" style="text-indent: 21pt"> </p>
<p class="MsoNormal" style="text-indent: 21pt"><span style="mso-spacerun: 'yes'; font-family: "Times New Roman"; font-size: 10.5pt"><img src="https://img2020.cnblogs.com/blog/1172834/202009/1172834-20200924115453558-1782538999.gif" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></span></p>
</div>
<div id="MySignature" role="contentinfo">
前进时,请别遗忘了身后的脚印。<br><br>
来源:https://www.cnblogs.com/liudaihuablogs/p/13468411.html
頁:
[1]