首页
Search
1
解决visual studio code (vscode)安装时没有选择安装路径问题
321 阅读
2
如何在 Clash for Windows 上配置服务
216 阅读
3
Linux 下 Bash 脚本 bad interpreter 报错的解决方法
150 阅读
4
Arch Linux 下解决 KDE Plasma Discover 的 Unable to load applications 错误
149 阅读
5
uniapp打包app提示通讯录权限问题,如何取消通讯录权限
113 阅读
clash
服务器
javascript
全部
游戏资讯
登录
Search
加速器之家
累计撰写
1,205
篇文章
累计收到
0
条评论
首页
栏目
clash
服务器
javascript
全部
游戏资讯
页面
搜索到
768
篇与
的结果
2024-10-21
不平凡的2016年
2016年就这么过去了,最近因为项目比较近,经常加班,今天也才有机会静下心来想想刚刚过去的这一年。我记得2016年的元旦也是在加班,同学过来我这边住还得等我加完班之后才能回去。今天的元旦前后又是忙碌的状态,是在为某项目做一个拉取流量的活动,时间短,接口多,经常需要调试,经常需要加班;而且还造成另一个项目的开始时间一直在延期;然后元旦之后还有一个第4季度的工程师之星评选。时间确实非常紧,不过好歹一步步走,总算是都差不多完成了。大致翻看了一下去年定下的目标,也就实现了一个目标,其他的都没有实现。本来一直打算买一个大点的显示器,不过后来搬家了,桌子变得非常小,导致没有显示器的地方,就搁置了。入职腾讯差不多1年3个月,总的来说稳中有升吧。上半年是进行新闻各频道的改版,下半年里有个奥运会,还有进行其他的工作。翻看了下2016年完成的工作清单,没有出彩的地方,换句话说,就是稳定。在这一年里,确实有些松懈,新技术学习的不到位,接下来要重点学习了。老抓着旧技术不放,总是会被淘汰的。 2017年的目标 # 虽然定目标没什么卵用,但还是要定的: 学习vue,熟练使用vue; leetcode上达到100的正确题目; 换一个单间,我们自己住,这个时候就可以买个显示器了; 希望明年的薪资能再涨涨; 学习下node,这个可能会成为下一年的重点; 希望生活越来越好 愿所有人能在2017年过的更好,加油!
2024年10月21日
8 阅读
0 评论
0 点赞
2024-10-21
从0到1学习node系列总索引
在node学习中,也总结了一些自己的经验和学习经历,希望能给大家提供一些帮助。 从0到1学习node(一)之模块规范 从0到1学习node(二)之搭建http服务器 从0到1学习node(三)之文件操作 从0到1学习node(四)之简易的网络爬虫 从0到1学习node(五)之mysql数据库的操作 从0到1学习node(六)之express初识 从0到1学习node(七)之express搭建简易论坛 从0到1学习node(八)之异步控制工具asyn 持续更新中...
2024年10月21日
9 阅读
0 评论
0 点赞
2024-10-21
从0到1学习node(一)之模块规范
总索引: 从0到1学习node系列总索引在讲解CommonJS, AMD, CMD这些概念之前,我们首先俩了解下js的模块化。模块化,顾名思义,就是将项目按照功能或者其他逻辑进行分解处理,每个部分只处理一个功能,进行功能的解耦处理,方便以后的开发和维护。那么模块化必须具有以下的能力,才能进行模块的拆分和组装: 定义封装的模块; 定义新模块对其他模块的依赖; 可对其他模块的引入支持; 那么就需要一套规范准则来定义这些能力,于是就出现了CommonJS, AMD, CMD等。 1. CommonJS # CommonJS原先叫做ServerJS,是js在服务端的规范,node使用的就是这种规范。根据CommonJS规范,一个单独的文件就是一个模块,require用来加载一个模块,exports用来向外部暴露该模块里的方法或属性。例如:// hello.js function say(username){ console.log( 'hello, '+username ); } exports.say = say; =============// main.js var person = require('./hello'); person.say('wenzi'); // hello, wenzi person.say('师少兵'); // hello, 师少兵 person.say('NUC'); // hello, NUC 同时,require语句可以写在文件中的任何位置,只要使用之前引用之前即可,不一定要写在文件的最前面。不过,为了代码更易阅读,能直观地看到当前引用了哪些模块,最好是放在文件的最前面。 exports与module.exports的区别 # 可能有人见过直接使用exports的,有的是使用module.exports的,这里稍微的讲解下这两者的区别。先举个简单的例子:var a = {name:'wenzi'}; var b = a; console.log(a); // {name: "wenzi"} console.log(b); // {name: "wenzi"} a和b输出的结果是一样的。现在我改变下b中name的值:b.name = 'shaobing'; console.log(a); // {name: "shaobing"} console.log(b); // {name: "shaobing"} a和b的输出结果都发生了改变。我再对b进行重新声明:var b = {name:'师少兵'}; console.log(a); // {name: "shaobing"} console.log(b); // {name: "师少兵"} 这三个例子输出了三种结果: 声明a对象,并把a赋值给b,然后a和b输出了相同的结果; 改变了b中的name,那么a中的name也跟着改变; 重新声明了b对象,那么a中的name则没有跟着b一起改变 解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以1中的输出是一样的。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,a 也会体现出来,所以第2个例子输出也一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后输出会不一样。那么此时就可以引出exports和module.exports了: module.exports 初始值为一个空对象 {} exports 是指向的 module.exports 的引用 require() 返回的是 module.exports 而不是 exports 如果module.exports发生了新指向,则exports无效;若module.exports没有发生变化,则直接exports即可。 2. AMD与RequireJS # 说到AMD,不得不说到RequireJS,AMD从CommonJS社区独立出来,单独成为了AMD社区,AMD的流行,很大程度上也是依托了RequireJS作者的推广。AMD规范中,默认推荐的模块格式是:// hello.js // 将需要引入的模块全部写入到数组中,然后传递参数进行调用 define(['a', 'b'], function(a, ,b){ // do something return{ hello : function(username){ console.log( 'hello, '+username ); } } }) ==========// main.js define(['./hello'], function(h){ h.hello('wenzi'); }) 也就是说,在AMD中,模块必须使用define定义,依赖通过函数参数传进来,这样的一个好处就是所有的依赖都能一目了然。 3. CMD与seajs # CMD规范是国内著名的玉伯大神提出来的,将就的就是就近依赖,什么时候用到,就在那个地方进行require。SeaJS就是使用的CMD规范:// hello.js define(function(require, exports, module){ var a = require('a'); // do a var b = require( 'b' ); // do b module.exports.hello = hello; // 对外输出hello }) 从这里也能看到AMD和CMD的区别: AMD通常需要一次性引入全部的依赖,然后通过参数传递;而CMD则需要时才引入 不过,AMD也支持CMD这样的引入格式,但内部还是按照AMD的逻辑进行执行。 4. 总结 # 这篇文章里介绍了下CommonJS, AMD, CMD规范的相关区别与联系,这里再简要的总结下: CommonJS: 每个文件就是一个模块,不用define进行定义,node使用此规范; AMD: 使用define定义一个模块,讲究提前依赖; CMD: 使用define定义模块,将就就近依赖 接下来,我们就要开始正式进行node的学习了。
2024年10月21日
7 阅读
0 评论
0 点赞
2024-10-21
从0到1学习node(二)之搭建http服务器
总索引: 从0到1学习node系列总索引在上节的课前学习中,我们了解了一下不同模块规范之间的联系与区别。本节我们正式开始node的学习,首先我们从搭建一个http服务器,能运行简单的程序开始说起。 1. hello world # 最经典的hello world。首先我们创建一个server.js来保存我们的代码:console.log( 'hello world' ); 在终端输入node server.js运行:node server.js 终端就会输出 hello world 的字样。可是我们一个node服务器程序,总是要在浏览器上访问的呀,这里就要用到node里自带的http模块了:var http = require('http'); // 引入http模块 // 创建http服务器 // request : 从浏览器带来的请求信息 // response : 从服务器返回给浏览器的信息 http.createServer(function(request, response){ response.writeHead(200, {'content-type': 'text/plain'}); // 设置头部信息,输出text文本 response.write('hello world'); // 输出到页面中的信息 response.end(); // 返回结束 }).listen(3000); console.log('server has started...'); 我们再次在终端输入node server.js运行,终端里会有输出 server has started... 的字样,表示服务器已创建并正在运行,然后我们在浏览器上访问127.0.0.1:3000,就可以看到页面中输出了hello world。 2. form表单 # 刚才我们只是在页面中输出了一段简单的文本,现在我们要在页面中呈现一个表单,可以让用户输入信息并进行提交:// server.js var http = require('http'); http.createServer(function(request, response){ var html = '\ \ \ \ \ \username : \password : \age : \\\ \ '; var query = url.parse( request.url, true ).query; if( query.submit ){ var data = 'back'+ 'username:'+query.username+''+ 'password:'+query.password+''+ 'age:'+query.age+''; response.writeHead(200, {'content-type': 'text/html'}); response.write(data); }else{ response.writeHead(200, {'content-type': 'text/html'}); response.write(html); } response.end(); // 结束 }).listen(3000); console.log('server has started...'); 我们再次运行提交后就能在页面中显示出数据了。url.parse是用来解析URL字符串的,并返回解析后的URL对象。若我们只输出一下 url.parse(request.url) :url.parse(request.url); result:{ protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: '?username=111113&password=123&age=122&submit=submit', query: 'username=111113&password=123&age=122&submit=submit', pathname: '/', path: '/?username=111113&password=123&age=122&submit=submit', href: '/?username=111113&password=123&age=122&submit=submit' } 如果将第2个参数设置为true,则会将返回结果中的query属性解析为一个对象,其他属性不变;默认值为false,即query属性是一个字符串:url.parse(request.url, true); result:{ ... query: { username: '111113', password: '123', age: '122', submit: 'submit' }, ... } 因此我们可以通过如下语句判断是否有提交数据并获取提交数据,然后再输出到中即可:var query = url.parse( request.url, true ).query; /* { username: '111113', password: '123', age: '122', submit: 'submit' } */ 2.2 获取表单POST方式提交的数据 # 现在我们使用post方式来提交数据。因为POST请求一般都比较“重” (用户可能会输入大量的内容),如果用阻塞的方式来处理处理,必然会导致用户操作的阻塞。因此node将post数据拆分为很多小的数据块,然后通过data事件(表示新的小数据块到达了)和end事件传递这些小数据块(表示所有的数据都已经接收完毕)。 所以,我们的思路应该是:在data事件中获取数据块,在end事件中操作数据。// server.js var http = require('http'), querystring = require('querystring'); http.createServer(function(request, response){ var html = '\ \ \ \ \ \username : \password : \age : \\\ \ '; response.writeHead(200, {"Content-Type":"text/html"}); response.write( html ); response.end(); } exports.start = start; 展示获取的数据:// uploader.js 展示获取的数据 var querystring = require('querystring'); function upload(request, response){ var postData = ''; request.addListener('data', function(chunk){ postData += chunk; }); request.addListener('end', function(){ var data = querystring.parse(postData); console.log( 'postData: '+postData ); console.log(data); var s = 'back'+ 'username:'+data.username+''+ 'password:'+data.password+''+ 'age:'+data.age+''; response.writeHead(200, {'content-type': 'text/html'}); response.write(s); response.end(); }) } exports.upload = upload; 然后在server.js中进行路由选择// server.js var http = require('http'), url = require('url'); http.createServer(function(request, response){ var pathname = url.parse(request.url).pathname; console.log(pathname); response.end(); }).listen(3000); console.log('server has started...'); 我们任意改变URL地址,会看到输出的每个地址的pathname(忽略/favicon.ico):http://127.0.0.1:3000/ // 输出: / http://127.0.0.1:3000/show/ // 输出: /show/ http://127.0.0.1:3000/show/img/ // 输出: /show/img/ http://127.0.0.1:3000/show/?username=wenzi // 输出: /show/ 因此我们就根据pathname进行路由,对路由进行方法映射:// server.js var http = require('http'), url = require('url'), starter = require('./starter'), uploader = require('./uploader'); http.createServer(function(request, response){ var pathname = url.parse(request.url).pathname; var routeurl = { '/' : starter.start, '/show' : uploader.upload } if( typeof routeurl[pathname]=== 'function' ){ routeurl[pathname](request, response); }else{ console.log('404 not found!'); response.end(); } }).listen(3000); console.log('server has started...'); 如果匹配到路由 / ,则执行 starter.start(request, response) ;如果匹配到路由 /show ,则执行 uploader.upload(request, response) 。如果都没匹配到,则显示404。 4. 图片上传并显示 # 在上面我们已经能成功提交数据了,这里来讲解如何进行图片上传并显示。使用node自带的模块处理起来非常的麻烦,这里我们使用别人已经开发好的formidable模块进行编写,它对解析上传的文件数据做了很好的抽象。npm install formidable --save-dev 在starter.js中,我们添加上file控件:// starter.js function start(request, response){ var html = '\ \
2024年10月21日
7 阅读
0 评论
0 点赞
2024-10-21
从0到1学习node(三)之文件操作
总索引: 从0到1学习node系列总索引这节稍微的讲解下node中对文件和目录的操作,我们不一个个讲每个api的使用,只是从几个例子来了解下下文件系统。 1. 文件操作 # 在文件操作里,主要是有文件读写,创建、移动文件等。 1.1 读取文件 # 读取文本文件时,如.txt, .js, .json等文件,直接使用readFile就可以获取文件的内容。// server.js var fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){ if(err) throw err; console.log(data); }); 读取图片时,我们是不能直接输出到控制台中的,是需要创建一个服务器,然后在浏览器上进行查看。其实在上节中,我们已经了解过显示图片的过程了。// server.js var http = require('http'), fs = require('fs'); http.createServer(function(request, response){ // 使用二进制方式读取图片 fs.readFile('./img/test.png', 'binary', function(err, file){ if( err ) throw err; // 当前数据以image/png方式进行输出 response.writeHead(200, {"Content-Type": "image/png"}); response.write(file, 'binary'); response.end(); }); }).listen(3000); console.log('server has started...'); 打开浏览器:127.0.0.1:3000,就能看到图片了。 1.2 写入文件 # 将字符串写入到文件文件中,是非常简单的操作,使用writeFile即可搞定:var fs = require('fs'); var data = '从一开始,就选择了做前端开发,因为觉得前端开发更贴近用户,能够倾听用户的声音,更好玩,更有意思,美的更直观。我们总是在尝试最新的技术,尝试更炫的效果,希望更能优化用户的体验效果!'; fs.writeFile('./test.txt', data, function(err){ if(err) throw err; console.log('写入数据成功...'); }); writeFile方法,在没有文件时会创建文件并写入;若文件存在则内容被覆盖。 1.3 创建或文件重命名 # 根据writeFile的特性,可以使用writeFile写入空字符串的方式创建文件。同时,fs.open也可以创建文件:// 打开模式可以使用 w | w+ | a | a+ // 这些模式在打开不存在的文件时,会创建文件 // fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄 fs.open(Date.now()+'.txt', 'a+', function(err, fd){ if(err) throw err; console.log(fd); }) 在文件系统中,有一个fs.rename的方法,顾名思义,对文件(文件夹)进行重命名。fs.rename(oldname, newname, callback(err)); 特性:将oldname文件(目录)移动至newname的路径下,并重新命名;如果oldname和newname是同一个路径,则直接进行重命名。 2. 文件夹操作 # 通常对目录的操作比较简单一些。 2.1 读取文件夹中的文件和文件夹列表 # 使用fs.readdir(path, callback)可以获取path路径下的文件和目录列表,而且只能读取直接目录下的文件和文件夹,子目录里的是获取不到的。fs.readdir('./', function(err, files){ if(err) throw err; console.log( files ); }); 输出结果:[ 'img', 'msg.txt', 'node_modules', 'package.json', 'server.js', 'test.js', 'tmp' ] node_modules和tmp是文件夹,剩下的是文件,而且是获取不到node_modules和tmp里面的数据。获取一个目录下所有的文件,后面会讲解,稍等。 2.2 删除文件夹 # 使用fs.rmdir(path, callback)可以删除文件夹,但只能删除空文件夹,如果当前路径不是文件夹或当前文件夹不为空,则删除失败;删除的为空文件夹时,可以删除成功。fs.rmdir('./tmp', function(err){ if(err){ console.log('删除文件夹失败'); throw err; }else{ console.log('删除成功'); } }) 如何删除不为空的目录,后面会讲解,稍等。 2.3 获取文件或文件夹的信息 # fs.stat(path, callback)能够获取path路径的信息,比如创建时间,修改时间,文件大小,当前是否为文件,当前是否为文件夹等信息;如果path路径不存在,则抛出异常。fs.stat('./test.js', function(err, stats){ if( err ){ console.log( '路径错误' ); throw err; } console.log(stats); console.log( 'isfile: '+stats.isFile() ); // 是否为文件 console.log( 'isdir: '+stats.isDirectory() ); // 是否为文件夹 }); 结果:{ dev: -29606086, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 2251799813687343, size: 2063, // path路径为文件夹时,size为0 blocks: undefined, atime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间), mtime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), ctime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), birthtime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间) } isfile: true // 是否为文件 isdir: false // 是否为文件夹 关于这几个时间属性的理解,可以参考我之前写的博文:【对gulp-changed插件的一点思考】stats中的size属性就是当前文件的大小(单位:字节,除以1024即为kb),stats还有下面方法可供使用: stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() (only valid with fs.lstat()) stats.isFIFO() stats.isSocket() fs.stat(path, callback)是异步执行的,对应的还有同步执行版本:fs.statSync(path),这个方法返回的就是fs.stats实例。 3. 综合运用 # 我们在上面的讲解中,还留着两个功能没实现,这里实现一下它的过程。 3.1 遍历目录中所有的文件 # 我们已经知道使用readdir只能获取当前目录里的文件和文件夹名称,为了获取这个目录里所有的文件名称,只能是读取当前目录里所有的文件夹里的文件。这里我们使用递归的方法,如果当前资源是文件,则进行存储,是文件夹则进行递归进一步检索,直到把所有的文件夹遍历完毕。// 获取文件夹中所有的文件 function readDirAll(path){ // 获取字符串的最后一个字符 var getLastCode = function(str){ return str.substr(str.length-1, 1); } var result = []; // 存储获取到的文件 var stats = fs.statSync(path); // 获取当前文件的状态 if( stats.isFile() ){ result.push(path); }else if( stats.isDirectory() ){ // 若当前路径是文件夹,则获取路径下所有的信息,并循环 var files = fs.readdirSync(path); for(var i=0, len=files.length; i
2024年10月21日
7 阅读
0 评论
0 点赞
1
...
50
51
52
...
154