硅谷-Node.js基础入门喝茶时间开始,Node.jsnode安装信息入门node-v检测安装版本cnpm淘宝镜像安装window环境https://www.jianshu.com/p/985。..npminstall-gcnpm--registry=https://registry.npm.taobao.orgmac在添加sudo之前以管理员权限安装sudonpminstall-gcnpm--registry=https://registry.npm.taobao。orgnpm,cnpm安装node包的规则,以安装webpack包为例cnpminit//初始化项目创建一个package.json文件package.jsondependencies(依赖)devDependencies(开发依赖)script(npmrunbuidrunscript)cnpminstallwebpack//将模块安装到项目目录下,不会将模块依赖写入pakage.jsoncnpminstall--globalwebpack//--global(-g)表示全局安装,一般用于安装工具比如脚手架cnpminstall--savewebpack//--save(-s)表示本地安装,会添加到dependencies(生产依赖)部分cnpminsall--save-devwebpack//--save-dev表示本地安装,会添加到devDependencies(开发依赖)部分cnpminstall--savewebpack@4.0.0//安装特定版本的webpack,后面加'@versionnumber'即可cnpminstallwebpackwebpack-cli-D//installboth安装一个包,根据devDependencies(开发依赖)中的npminstall参数将模块安装到项目目录\n不会将模块依赖写入pakage.jsonnpminstallmoduleName会全局安装模块,\n哪个会安装在磁盘上的具体位置,\n取决于npmconfigprefixnpminstall-gmoduleNamenpminstallmodulesName-g的位置是将模块安装到项目目录下,\n并在包文件的dependencies\n节点写依赖生产依赖npminstallmoduleName-Snpminstall-savemoduleNamenpminstallmoduleName--save将模块安装到项目目录中,\n并将依赖项写入包文件的devDependencies\n节点中。开发依赖npmimoduleName-DnpminstallmoduleName-Dnpminstall--save-devmoduleNamenpminstallmoduleName--save-dev会安装到生产依赖中,最好不要使用npmuninstallmoduleName-D//Uninstalldependencies如何安装如何卸载,install可以改成uninstall如何运行node包npx命令运行包(5.0后新增的命令)npmrunbuild命令运行包在package.jsscripr配置运行脚本:{"build":webpack--configmyconfig.js}然后就可以直接在命令行输入npmrunbuild来运行webpack了。进程和线程进程负责为程序运行提供必要的环境。流程相当于工厂中的车间线程。线程是计算机中最小的计算单元。线程负责执行过程的程序线程相当于工厂里的工人。单线程js有单线程和多线程之分。Java\python都是多线程语言的视频教程。Node.jsNode可以在后台编写服务进程。进程负责为程序运行提供必要的环境。该过程相当于工厂中的车间线程。线程是计算机中最小的计算单元。线程负责执行进程中的程序。线程相当于工厂线程Worker单线程js是单线程多线程Java/Python都是多线程语言。传统服务器是多线程的。每次有请求进来,都会创建一个线程来处理请求。节点服务器是单线程的。Node在处理请求时是单线程的,但在后台有一个I/O线程池。特点是异步、事件驱动、非阻塞IO模块化。在node中,一个js文件就是一个模块。在node中,每个js代码独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中是访问不到的不要老是往全局写东西,会污染全局作用域,污染全局命名空间,这种模块化的方式可以避免污染全局命名空间CommonJs定义模块非常简单模块引用reuqire()模块定义创建一个js文件export添加属性或方法输出模块标识01.helloNode.j//引入其他模块/*1.在node中,使用require()函数导入外部模块2.require()可以传入一个文件路径作为参数,node会根据路径自动将外部模块的路径导入到这里。如果是相对路径,则必须以./或../开头3.使用require()导入模块后,函数会返回一个对象,代表导入的模块4.我们使用require()导入external在使用模块时,使用模块标识符,我们可以通过标识符找到指定的模块——我没看到分为两类:核心模块——节点引擎提供的模块//varfs=要求('fs');console.log(fs)//文件模块不用写路径,直接写名字即可//varpath=require('path');//路由模块//varhttp=require('http');//服务模块-核心模块的标识是模块文件名模块-用户创建的模块-文件模块的标识是文件的路径(绝对路径,相对路径)相对路径使用./或../开头*/varmd=require("./02.module.js");console.log(md)02.module.jsconsole.log('我是模块,我是02.module.js');/*我们可以通过exports对外暴露暴露变量和方法,只需要将需要对外暴露的变量或方法设置为exports的属性即可*///expose到外部的属性或方法export.x="Iamxin02.module.js";export.y="Igotyin02.module.js";#包包1。包结构-package.json:描述文件,必须-bin:可执行二进制文件这里的文件可以在系统中直接运行//一般不会有这个文件,除非是一些工具webpack-lib:依赖其他js代码,库(library,library),不需要-doc:文档,不需要-test:单元测试,不需要2.包规范#npm1。npm-v:查看npm版本2.npmversion:查看所有模块版本3.npmseaarchmath:搜索数学包4.npminit:初始化package.json5.npminstallmath(npmimath):安装数学包,安装包时根据package.json来识别,没有这个如果文件不能被识别为包,则全局安装6.npmremovemath(npmrmath):删除math包7.npmimath--save(npmimath-S):install生成依赖8.npminstall:自动根据package.json中的依赖下载所有包9.npminstallmath-g:全局安装包(全局安装的包一般是一些工具)*通过npm下载的包放在node_modules文件夹下。通过下载的包,可以直接通过包名导入//varexpress=require('express')*当node使用模块名导入模块时,会先查找该模块是否包含在node_modules中当前目录。如果有,则直接使用,如果没有,则到上层的node_modules中查找,如果有,则直接使用,如果没有,则到上层查找,直到找到为止在磁盘根目录下,如果还是找不到,会报错index.jsentryFilevarmath=require('math');console.log(math);//查看math包的所有方法#cnpm淘宝镜像https://developer.aliyun.com/mirror/NPM?from=tnpmnpminstall-gcnpm--registry=https://registry.npm.taobao.org#Buffer(缓冲区)文档地址http://nodejs.cn/api/buffer.html视频地址https://www.bilibili.com/video/BV1bs411E7pD?p=13*中间传输数据的容器是用于缓存二进制数据节点作为服务器,接收到的数据是二进制的,所以必须存放在缓冲区中,发送给用户的数据也是二进制的,先存放在缓冲区中,然后再发送1.的结构buffer和数组很相似,操作方法也和数组相似,*js原生数组性能比较差,这也是js被其他语言诟病的原因之一2.数组不能存储:图片、MP3、视频(比如二进制文件),而Buffer是专门用来存储二进制数据的,性能优于数组。*它的元素是两位十六进制数。*一个元素代表内存中的一个字节。*其实Buffer中的内存并不是JavaScript分配的,而是在底层是由c++申请的,也就是我们可以直接通过Buffer在内存中创建空间。3.Buffer是node中的一个核心对象。使用Buffer不需要引入模块,直接使用即可。4、Buffer中存放的是Binary数据,(计算机中所有的二进制数据都以16进制显示)*数据最终发送给客户端,在传输过程中数据以二进制形式传输*各个元素的范围在Buffer中是从00-ff(十六进制)0-255(十进制)00000000-11111111(二进制八个0到八个1)一个0或者一个1在计算机中叫做1位(bit)8bit=1byte(字节)1024kb=1kb1024kb=1mb1024mb=1gb1024gb=1tb一个字节是缓冲区中的一个元素,是数据传输的最小单位,在内存中占据一个字节。5.Buffer的大小一旦确定,就不能再改变。Buffer其实是对底层内存的直接操作。一旦创建,就会在内存中开辟一个固定大小的空间。如果增加,需要开辟新的空间,内存地址不连续。性能极差,一旦确定了大小,就不能再改变创建一个buffer.js文件,运行如下代码//保存一个字符串到缓冲区varstr="HelloBuffer";//一个英文1字节varstr="HelloShangSiliconValley";//一个汉字3个字节,3个汉字9个字节,共占用内存15个字节varbuf=Buffer.from(str);//console.log(buf);//Buffer其实做了一件事,将str转换成二进制数据保存//console.log(buf.length);//占用内存的大小//console.log(buf.length);//字符串的长度//创建一个长度为10字节的buffer//varbuf2=newBuffer(10);//不推荐使用bufferconstructorsvarbuf2=Buffer.alloc(10);//使用索引操作bufbuf2[0]=88;buf2[1]=255;buf2[2]=0xaa;//在16进制aa前加0xbuf2[15]=255;//buf2长度为10,一旦创建,大小不能改变,设置无用buf[3]=556;//566转换成二进制是//1000101100超过8位,只保留后8位//00101100(十六进制为2c)//console.log(buf2);//console.log(buf2[2]);//输出170(0xaa对应的十进制)只要是控制台输出的数字,就一定是十进制//只要是数字,就一直输出都是以10为底。转成字符串,传16输出对应的十六进制//console.log(bug2[2].toString(16));//for(vari=0;i
