当前位置: 首页 > 后端技术 > Node.js

node.js入门必须知道的事情

时间:2023-04-03 19:55:36 Node.js

Node.js入门你必须知道的事情并使用cd命令切换到该文件夹??mkdirnodeTest&&cdnodeTest创建一个js文件并编写简单的js代码toucha.js`vara=10;console.log(a);console.log(a+10);`在命令行输入nodea.js,命令行会输出1020node参考文件。Node.js采用CommonJS规范,通过require引入一个js文件,新建一个文件b.js并导入a.jstouchb。jsrequire('./a.js')执行b.jsnodeb.js命令行会输出1020node中的module概念node中的module是一个js文件,多个modules组成一堆具有特定功能的文件称为一个packagejs文件可以定义自己对外暴露的变量(意思是其他文件通过require引用它后如何使用),node一共提供了exports和module.exports两个变量来实现它a.jsfunctionfunc1(){console.log('aaa')}functionfunc2(){console.log('bbb')}exports.a=func1exports.b=func2b.jsvara=require('./a.js')a.a()//会打印出aaaa.b()//会打印出bbbc.js//es6模式匹配写法var{fun1,fun2}=require('./a.js')//fun1和fun2必须相同a.js中的变量名,这里是固定的日志('aaa')}这个。func2=function(){console.log('bbb')}}module.exports=Hellob.jsvarTest=require('./a.js')vartest=newTest()test.func1()测试.func2()exports和module.exportsexports之间的关系是对module.exports的引用,这意味着它指向相同的内存地址。Module.exports实际上是在node中生效的。修改exports本质上就是修改module.exports的值。比如exports.a=3,其实module.exports.a也等于3。比如exports={},这样exports和module.exports指向的对象是不同的,不管怎样你后面修改exports,不会影响module.exports的值,不会影响文件输出的变量。比如module.exports={},这样造成的效果和上面exports={}的效果是一样的。这里的表达方式有问题,虽然module.exports={}和exports={}都让exports和module.exports的引用不一样,但是最终的效果其实是不一样的。具体用法见评论区感谢@吉琪好传差指出错误建议:如果还是分不清它们的区别,以后不用module.exports的时候就用exports吧。如果导出类,则必须使用模块。不要用export来导出,不要混在一起就不会出错。node中的npm节点默认自带npm。一堆具有特定功能的js文件。通过npm,我们可以引入这些包(如果你不理解,把包理解为插件也没什么错)来轻松实现一些功能。要安装一个模块,你只需要npminstallxxx来安装它。然后在自己的js中使用varxxx=require('./xxx')即可使用。通过npminstallxxx安装xxx模块后,你会发现当前目录下多了一个node_modules文件夹,打开node_modules文件夹你会发现里面多了一个xxx文件夹。当你执行npminstallxxx时,npm实际上只是为你下载了包xxx,仅此而已。当你通过npm安装了十几个或者更多的包时,你可能不知道自己安装了哪些包,因为很多包都依赖于其他包(一个包使用另一个包提供的功能是很正常的,就像我们使用其他包中的函数),所以npm提供了package.json文件来管理包。package.json是一个可以定义很多键值对的文件。有几个字段非常重要。定义你自己的脚本,main意味着你将通过这个文件导入所有的包。当你在dependencies和devDependencies中定义依赖,然后在命令行输入npminstall时,npm会自动为你安装这些包;在命令行输入npminstallxxx--save后,npm会自动将xxx添加到package.json中的dependencies中,如果执行npminstallxxx--save-dev,则会自动将xxx添加到devDependencies中。scripts中定义的脚本可以直接在命令行运行。如果还是不明白,可以看看我的另一篇文章,如何制作自己的npm包node.js自带的moduleshttpmodule使用别人的modules其实就是使用别人写的方法(函数)。你只需要弄清楚如何使用别人提供的方法。可以去node.js官网查看api,也可以看网上写的教程。.下面演示最简单的http模块的使用。在当前目录下命令行输入nodetest.js,http会挂起一个监听器。只需要在浏览器中输入http://localhost:8000,test.js就会返回

helloworld
给浏览器并显示在页面上:test.jsvarhttp=require('http')varcallBack=function(req,res){res.write('
helloworld
')res.end()}http.createServer(callBack).listen(8000)url模块传入一个http模块示例中的回调函数,两个参数分别是request和response。前者是浏览器传递给我们的对象,后者是我们传递给浏览器的对象。其中req包含url属性,可以在回调函数console.log(req.url)中打印出来,在浏览器中输入的是:http://localhost:8000/aaa/bbb?abc=3,那么打印出来的值就是:/aaa/bbb?abc=3这里我们需要用到/aaa/bbb和abc=3分开的结果,node给我们提供了一个处理url的模块,叫做url模块。当然,如果你想自己处理这个url,用正则表达式是完全可以的,但是既然已经有现成的了,何乐而不为呢?下面简单演示一下用法,在浏览器中输入:http://localhost:8000/aaa/bbb?abc=3test.jsvarhttp=require('http')varurl=require('url')varcallBack=function(req,res){varurlString=url.parse(req.url)varpath=urlString.pathnamevarquery=urlString.queryconsole.log(path,query)//打印出来/aaa/bbbabc=3res.write('
helloworld
')res.end()}http.createServer(callBack).listen(8000)fs模块fs是提供文件操作功能的模块,可以进行如下操作读取、写入、存储和删除文件。下面演示将这个js的内容返回给浏览器:jsvarhttp=require('http')varfs=require('fs')varcallBack=function(req,res){fs.readFile('./test.js','utf-8',function(err,data){res.write(data)res.end()})}http.createServer(callBack).listen(8000)使用http模块、url模块、http模块构建静态服务器varhttp=require('http')varurl=require('url')varfs=require('fs')varcallBack=function(req,res){varpathname=url.parse(req.url).pathnameif(pathname=='/'){pathname='/index.html'}fs.readFile('.'+pathname,'utf-8',function(err,data){if(err){res.write('错误404')}else{res.write(data)}res.end()})}http.createServer(callBack).listen(8000)使用外部模块简单说明,外部模块是第三方提供的模块,node.jsdefault没有提供,所以需要用npm安装。此处提供了package.json文件。你只需要执行npminstall来安装它。另外,它是管理MongoDB数据库的包,所以需要在本地单独安装MongoDBpackage.json{"dependencies":{"cheerio":"^1.0.0-rc.2","eventproxy":"^1.0.0","express":"^4.16.2","koa":"^2.4.1","superagent":"^3.8.1"}}expressexpress提供了基本的路由和静态文件访问功能,当然还有其他功能,这里主要是演示它的基本使用。下面1、2、3都是在public和files目录下设置为静态文件,可以直接通过文件路径访问。1、2可以同时存在,即可以指定几个目录。它是一个静态文件目录。指定目录为静态文件后,需要省略该目录访问静态文件,如访问public目录下的css/index.css:localhost:8000/css/index.css,直接省略public,即可通过3指定路径替换目录名。设置3后,需要访问public下的css/index.css:localhost:8000/public/css/index.cssvarexpress=require('express')varapp=express()1.app.use(express.静态('公共'))2。app.use(express.static('文件'))3。app.use('/static',express.static(public))app.get('/',function(req,res){res.send('HelloWorld');//一个回调方法对应一个路径})app.get('/user',function(req,res){res.send('user');})app.listen(8000,function(){console.log('appislisteningatport3000');})superagent,cheerio模块superagent是一个可以发送http请求的模块,回调函数中的res就是请求的内容cheerio是在服务端类中jquery风格的框架,你应该能看到下面的代码是抓糯米网的餐单链接varsuperagent=require('superagent')varcheerio=require('cheerio')varspideUrl='https://t10.nuomi.com/pc/t10/index'superagent.get(spideUrl).end(function(err,res){if(err){returnconsole.error(err);}varfoodUrls=[];var$=cheerio.load(res.text)//获取首页所有链接$('.j-itema').each(function(idx,element){var$element=$(element)foodUrls.push($element.attr('href'))})console.log(topicUrls)})当eventproxy爬取一堆类类链接时,一个一个写链接很麻烦。eventproxy提供监听,然后触发回调来处理这种问题,下面是我复制的一段代码,应该很容易理解//获取eventproxy实例varep=neweventproxy()//命令ep重复听urls.length次(这里是10次)ep.after('topic_html',urls.length,function(topics){topics=topics.map(function(page){var$=cheerio.load(page)varuserId=$('.runUserNameafont').eq(0).text()returnuserId});console.log(topics);})urls.forEach(function(item){superagent.get(item).end(function(err,res){ep.emit('topic_html',res.text)})})总结一下,大部分的前端学习其实就是没有必要深入学习节点。js,一方面我没有那个精力,然后也不是那么需要,但是一些基础的东西还是要学的。大部分前端同学认为自己应该学前端,其实平时接触到的npm、requiremodules、es6语法等问题比较难。我想我不了解node.js。其实这些和node.js没有关系。这些都影响了其他前端内容的学习。您仍然需要学习node.js的基础知识。东西还是有必要的,比如搭建一个简单的服务器,做一些基本的逻辑处理和数据处理,做一个爬虫。这些都很简单。阅读两篇博客并做一些练习就足够了。只是从实际情况中学习。