前言
Nodeschool是一个非常好的学习JavaScript和Node的平台,它在里面提供了大量的教程,通过做任务的方式让学习者理解某些概念,并且提供参考答案供自查(github源码的solution文件下),建议对基础概念模糊的同学可以去尝试一下这些任务。
learnyounode(node基础)
前言
这是nodeschool的第一个任务,它会让你接触node最基础的几个模块:fs、http、url、net等,也会让你了解node模块化和流的一些概念。
- HELLO WORLD(起手式)
第一个任务,主要是让学习者熟悉环境
- BABY STEPS(process.argv)
这个任务主要是让学习者学习process这个对象,平常我们通过node在命令行里执行各种命令的时候少不了它,而process的argv属性又是重中之重,它存储着外界输入进来的值。
学习者将会通过一个求和的任务熟悉process.argv。
- MY FIRST I/O!(fs.readFileSync)
在这个任务里,学习者将会接触到fs这个模块,以及它的readFileSync方法用来同步读取文件内容。
学习者将会通过打印一个文件中内容行数的任务来熟悉fs.readFileSync。
- MY FIRST ASYNC I/O!(fs.readFile)
和上一个任务相似,学习者在这个任务里将使用fs模块的异步读取文件方法readFile完成任务。
- FILTERED LS(fs.readdir)
这个任务还是和文件有关,只不过不是读取文件了,而是过滤文件名,fs模块的readdir方法将会帮助我们获取文件名,至于过滤拓展名,可能需要使用path模块的extname方法。
学习者将会通过打印出指定目录下的文件列表,并且以特定的文件名扩展名来过滤这个列表来熟悉fs.readdir
- MAKE IT MODULAR(模块化)
node的模块化做的很好,export和import是必备的知识。
这个任务我认为是有点难度的,因为你需要创建两个文件:一个封装好的模块和一个使用者,并且所有逻辑都必须封装的非常好,暴露出来的API也对使用者友好才能通过这个任务。
学习者需要在使用者里定义回调函数,在模块里定义执行逻辑来熟悉模块化。
- HTTP CLIENT(http客户端)
从这个任务开始,我们将会学习node的另一个核心模块:http
学习者将会通过起一个简单的http客户端来熟悉http模块的get方法。
- HTTP COLLECT(http流和管道)
这个任务是上一个任务的增强版,它揭示了node中很重要的一个概念:流,这个概念其实是借鉴于Unix,有输入流和输出流,用于程序各个部分间的协作通信,而衍生出的管道概念是对流进行一些特定操作的工具。
学习者将会通过收集服务器所返回的数据流和pipe方法处理它。可能会用到concat-stream模块收集所有流。
- JUGGLING ASYNC(异步http)
这个任务同样是上一个任务的增强版,它增加了异步概念,可以使用回调或者promise来处理这个异步情况。
- TIME SERVER(tcp与net)
这个任务,我们将会学习net模块(tcp),它的使用方法和http模块类似,不同点主要在于tcp是通过socket通信的。
学习者将会通过使用net模块写入当前的事件来熟悉net模块和tcp服务器。
- HTTP FILE SERVER(http与fs)
在这个任务中,我们将把http模块和文件模块结合使用,文件在node中同样可以以流形式存在(使用fs.createReadStream),所以我们将用流来连接这两个看似毫不相干的模块。
学习者将会通过读入文件流,然后将文件流通过管道输出到http流来体会流的强大作用。
- HTTP UPPERCASERER(http服务器)
这个任务的重点还是流,只不过具体形式是通过起一个http服务器来让学习者更加熟悉流的概念。
学习者将会通过http.createServer起一个简单的http服务器,并且通过管道把流中的数据转换成大写形式来进一步熟悉流在node中的应用。
- HTTP JSON API SERVER(http restful api)
最后一个任务是让我们做一个restful风格的http服务器,即使用json格式的api进行前后端通信。
学习者会用到url模块解析请求报文的url以及pathname,根据不同的请求路由返回不一样的响应报文。
stream-adventure(node中的流)
前言
流是Node中的核心概念,用于协助各个子程序间的合作,这个概念最初出自Unix编程,所以相应的,Node中的流也有管道、可读流、可写流等概念。
BEEP BOOP(起手式)
MEET PIPE(管道)
INPUT OUTPUT(I/O流)
TRANSFORM(操作流数据)
LINES(管线)
CONCAT(汇入流)
HTTP SERVER(HTTP服务端流)
HTTP CLIENT(HTTP客户端流)
WEBSOCKETS(websocket流)
HTML STREAM(文本混合流)
DUPLEXER(双工流)
DUPLEXER REDUX(操作双工流)
COMBINER(复杂流合并)
CRYPT(加密解密流)
SECRETZ(压缩与哈希流以及解析流)
learnyoubash(Unix shell)
前言
Unix的shell命令是一种专用语言,可以让用户自定义任务。
任务
HELLO WORLD(起手式)
VARIABLES(shell变量)
POSITIONAL PARAMETERS(shell位置参数)
ARRAYS(shell数组)
SHELL EXPANSIONS(shell拓展)
STREAMS PIPES AND LISTS(Unix流、管道管线)
IF CONDITIONAL STATEMENT(shell if判断)
CASE CONDITIONAL STATEMENT(shell case判断)
LOOPS(shell循环)
FUNCTIONS(shell函数)
DEBUGGING(shell调试)
regex-adventure(正则表达式)
前言
正则由Unix和Perl发展过来,具有强大的专用语言特性,是字符串匹配的好帮手,让我们看看js中如何使用正则表达式
LITERALLY(直接匹配)
ANCHOR START(开始锚点)
ANCHOR END(结束锚点)
CHARACTER CLASS(字符类别)
NEGATED CHARACTER CLASS(字符类别取反)
META(.匹配规则)
QUANTIFIER(*?+匹配规则)
SPLIT(结合split分割字符串)
CAPTURE(exec捕获)
CAPTURE BREAKWOR(\b边界)
ALTERATION(|逻辑或)
QUANTIFIED GROUP({}指定匹配数量)
QUOTES(/g标志位)
BLINK($1...分组)
function-programming(函数式编程)
前言
JS中的函数是一等公民,可以作为参数传递,也可以作为结果返回,自然可以进行函数式编程,Nodeschool提供了一套任务,可以帮助我们理解JS的函数式编程的基础概念。
Hello World(起手式)
Higher Order Functions(高阶函数)
Basic: Map(映射)
Basic: Filter(过滤)
Basic: Every Some(所有与存在)
Basic: Reduce(归纳)
Basic: Recursion(递归)
Basic: Call(函数调用)
Partial Application without Bind(apply调用)
Partial Application with Bind(bind调用)
Implement Map with Reduce(用reduce实现map)
Function Spies(函数间谍)
Blocking Event Loop(事件循环)
Trampoline(尾调用优化)
Async Loops(异步)
Recursion(高级递归)
Currying(柯里化)
Function Call(call高级)
promise-it-wont-hurt(promise特性)
前言
promise是es6最重要的特性之一,对前端控制异步流程非常有帮助。
- warm_up(认识异步)
- fulfill_a_promise(promise的resolve)
- reject_a_promise(promise的reject)
- to_reject_or_not_to_reject(同步转promise)
- always_async(promise永远异步)
- shortcuts(Promise.resolve和Promise.reject)
- promise_after_promise(promise链式调用)
- values_and_promises(promise混合同步值)
- throw_an_error(promise处理错误)
- an_important_rule(promise的catch)
- multiple_promises(模仿Promise.all)
- fetch_json(q-io/http与promise版ajax)
- do_some_work(综合应用promise)
esnext-generation和learn-generators(迭代器和生成器)
前言
迭代器和生成器是ES6借鉴python的高级语法,它们一个在操作数据结构(数组、对象)上,一个在异步操作上大放异彩,作为进阶JS知识的铺垫是非常有帮助的
introduction-to-iterators(造一个简单迭代器)
built-in-iterators(使用迭代器)
advanced-iterables(造一个高级迭代器)
introduction-to-generators(使用生成器)
passing-args-to-yield(修改生成器内部状态)
RUN STOP RUN(用生成器替代迭代器)
GENERATOR ITERATOR(用生成器替代递归)
DELEGATING GENERATORS(生成器委托)
CATCH ERROR!(生成器的异常处理)
LOOK SYNC. DO ASYNC(异步转同步)
LOOK SYNC. MAKE PROMISE(模仿async/await)
perfschool-playground(性能优化)
前言
前端工程师们在设计之初往往要考虑性能问题,而node提供了很多工具帮助我们优化性能,但是要切记:过早优化是万恶之源~
USING THE PAGESPEED API(衡量性能)
USING THE WEBPAGETEST API(精准衡量性能)
DEFER ALL THE THINGS(懒加载)
ENFORCING A PERFORMANCE BUDGET(简洁化)
REMOVING UNUSED CSS(精简CSS)
INLINING IMAGES(图片转Base64)
INLINING CRITICAL CSS(内嵌样式)
USING A FONT LOADER(可选加载字体)
CREATING SPRITESHEETS(雪碧图)
OPTIMIZING IMAGES(压缩图片)
lololodash(lodash入门)
前言
lodash是js非常重要的一个工具库,由undersocore发展而来,里面内置了很多强大的函数工具,主要针对集合、数组、对象。
- Getting Started(_.filter)
一个简单的任务,直接调用它的filter函数就能完成
- Sort Me(_.sortBy)
- In Every Case(_.forEach)
- Everyone Is Min(.every和.some)
- Chain Mail(_.chain与链式调用)
- Count the Comments(_.groupBy)
- Give Me an Overview(_.reduce)
- Analyze(_.filter综合使用)
- Start templating(_.template)
test-anything(js测试)
前言
测试驱动开发是一种软件开发方法,它是一种良好的设计,前端如今也可以通过测试来保障软件质量。
LOG IT OUT(console.log大法)
TELL ME WHAT IS WRONG(assert断言)
TAPE IT TOGETHER(tape模块批量测试)
CALL ME MAYBE(tape循环回调测试)
TO ERR IS HUMAN, TO PURR FELIN(综合测试)