Ninja:dev server made easy

Ninja是一款用于前后端分离开发的本地开发服务器,也被称为是前端容器。它有以下一些特性: HTML、CSS的热重载 根据配置文件自动生成路由 根据配置文件自动读取在线/本地的虚拟数据 支持Jinja2语法(以及其他Nodejs模板) 支持路由代理 支持webpack(通过webpack-dev-middleware) Ninja的前世今生 在木犀,之前我们的前后端分离开发方案是这样的:在本地运行一个简单的Flask应用,只包含路由,在路由中读取虚拟数据并渲染Jinja2模板,然后运行这个应用,进行开发。前端模板开发完成后和后端直接对接调试。 这种方案有一些明显的问题,首先是这个Flask应用没法规范化为一个命令或是一个包,这就需要我们每次在构建前端仓库时都手动写路由等逻辑,这显然是不现实的。还有一个问题就是,Flask的Python环境与目前前端工具生态的主流Nodejs格格不入,想要接入webpack等前端工具,我们必须使用Nodejs来构建我们的dev server。 于是我们需要一款能支持Jinja2语法,同时又能满足前端开发各种需要的dev server。Ninja就在这个节点上横空出世了! 基本用法 Ninja的上手非常简单,首先安装Ninja npm install -g ninja_cli 下面以Ninja和Webpack一起使用为例,这个例子的源代码在Ninja仓库的example文件夹下可以找到。 首先我们需要一个ninja.conf.js配置文件,当然你也可以选择用命令行参数配置。在这个文件里我们要配置一些必要的参数: module.exports = { template: "swig", // 模板引擎名 mock: "/mock/mock.json", // 虚拟数据位置 webpack: true, // 启用webpack支持 templateDir: "/template", // 模板文件目录 } 然后在webpack的配置里要注意entry和output的配置: entry: [ path.resolve(__dirname, './index.js') ], output: { path: '/', publicPath: 'http://localhost:3000/', filename: 'bundle.js' }, webpack的中间件提供静态文件,我们可以在Ninja的3000端口访问到,所以在模板中的静态文件路径可以写/+文件名。如<script src="/bundle.js"></script>。 配置好Webpack之后,我们写两个简单的模板 // base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ninja Test</title> </head> <body> <h2>I'm the head</h2> {% block content %}{% endblock %} <a href="/">index page</a> <a href="/second">second page</a> <script src="/bundle....

July 5, 2016

2016 FEDay见闻录

这次FEDay是我第一次参加开发者大会,也是第一次去广州。当初主要是冲着两个Facebook的工程师去的,因为我对React好感度很高。总的来说这次的收获还是很多的,也算是值回票价了。 ...

March 19, 2016

Let's build a jQuery!-Part 1(early release)

这个系列博客的灵感来源于这篇博客和一次失败的造轮子经历。出于对jQuery进行源码分析和让旧日作品发挥余热的目的,我开始写这一系列博客。主要内容就是从头开始打造一个jQuery-like的基础库,并且配上相应的源码,也就是我们的Litejs。 我们要做的工作有以下这些: 选择器和元素封装 DOM操作 Ajax请求 事件系统 触摸事件 分别对应这系列文章的四个部分。 好,让我们开启这段神奇的重复造轮子之旅吧! ...

March 11, 2016

前端面试题总结(持续更新)

接下来要参与大大小小的暑期实习笔试和面试。在这篇博客里我将总结一些常见的面试题。其中有一部分是我去年暑假找实习的时候总结的。现在看来,不免有些幼稚。慢慢完善吧! ...

March 11, 2016

DOM API详解(二)

###四、API详解-DOM CORE DOM标准的层级 DOM标准实际由很多的子模块组成,包括Core module,XML module,Events module,User interface Events module,Mouse Events module,Text Events module,Keyboard Events module,Mutation Events module,Mutation name Events module,HTML Events module,Load and Save module,Asynchronous load module,Validation module,和XPath module。 ...

January 26, 2016

DOM API详解(一)

一、什么是DOM Document Object Model(DOM)是用编程语言对HTML,XML以及SVG文档进行操作的接口。我们经常使用JavaScript来操纵DOM,不过DOM其实的语言无关的。它并不是JavaScript的一部分。 ...

January 23, 2016

2015年末必备前端工具集

原文链接: Must See JavaScript Dev Tools That Put Other Dev Tools to Shame 原文作者 : Eric Elliott 译文出自 : 掘金翻译计划 “Javascript没法胜任大型应用,因为它甚至不能确定一个变量的类型,而且很难重构”~一大堆困惑的人 当我初识Javascript的时候,只有一种浏览器需要关心:NetScape。它在微软开始捆绑销售IE和操作系统之前完全统治了世界。在那些日子里,Javascript的开发者工具很弱这种观点的确是对的。 不过这个观点已经被推翻很久了,今天,Javascript已经拥有了在我见过的所有语言中最好的开发工具生态系统。 请注意,我没有说“最好的IDE”。如果你正在寻找一款统一了不同开发工具使用体验的集成式IDE,请试试为C#打造的微软Visual Studio,和Unity一起使用风味更佳。虽然我本人并没有使用过,但是听我信任的人说这很靠谱。 我用过C++和虚幻引擎。当我第一次试用的时候,我意识到web平台的开发工具仍然有很长的路要走。 不过我们已经走过了很长一段路,现在我们在JS中使用的工具让IDE神奇的自动补全看起来就像是 小孩的玩具。尤为是JavaScript的运行时工具,在我见过的所有其他语言中都没有对手。 “Javascript拥有在我见过的所有语言中最好的开发工具生态系统。” 什么是开发者工具? 开发者工具是一套让开发者更轻松的软件集合。传统上,我们主要将IDE,linter,编译器,调试器,和性能分析器认为是开发者工具。 不过JavaScript是一种动态语言,伴随它的动态特性而来的是对运行时开发者工具的需求。JavaScript对此的需求程度很高。 为了实现我写这篇文章的初衷,我将包括对运行时工具的介绍,甚至包括一些能提升运行时开发者工具可视化和调试体验的库。开发工具与库之间的界线将开始模糊。与之而来的将是令人震惊的结果。 开发者工具一览表 Atom & atom-ternjs Chrome Dev Tools PageSpeed Insights FireFox Developer Edition BrowserSync TraceGL ironNode ESLint rtype (规范) & rfx (库) 提示: 这些是未完成的开发预览版 Babel Greenkeeper.io & updtr React Webpack + Hot module replacement Redux + Redux DevTools 关于这些工具 你的开发者生涯将围绕着这两个东西展开:编辑器,和你的运行环境(比如,浏览器,平台,和你代码的目标设备)...

December 28, 2015

Thoughts on Reset.css

###导语 CSS reset的作用主要就是清楚浏览器的默认样式,比如我们在Chrome里看到的User Agent Stylesheet就是Chrome浏览器的默认样式。不同的浏览器会有不同的默认样式,因此我们需要清除一些默认样式,以达到在所有浏览器里显示效果的一致。 不过这里面的学问还是很大的。首先我们只需要reset我们在项目中会使用的元素,这就涉及reset的模块化使用。第二我们只需要reset必要的属性。因为reset会加重浏览器渲染的性能开销,因此我们在css reset时必须要慎之又慎,保证最少的代码量和最佳的效果之间的平衡。 ...

November 5, 2015

Http Basic Authorization的使用

###1.Http Basic Authorization的请求格式 关于发起请求的http头格式,大家可以搜到很多相关资料。这里我们采用的方式比较特别,我们用mitmproxy这款http代理软件来拦截我们在终端的通过httpie发出的请求,分析其内容,从而得出Http Basic Authorization的请求格式。 首先我们发送一个http POST请求: http --auth neo1218@yeah.net POST http://121.43.230.104:5000/api/v1.0/token 拦截到的http header如下: 我们看到在http请求的header里有一个Authorization字段,内容有Basic标识符和一串编码组成。这串编程在经过解析之后,发现是username:password的base64编码。 这样就得到了我们Http Basic Authorization的请求格式,在http的请求头中加入字段格式是Authorization : Basic base64(username:password) ###2.Http Basic Authorization客户端使用,以ajax为例 下面以web端的ajax技术发起请求,来作为Http Basic Authorization客户端使用方法的实例。 var auth = btoa($(".username").val()+":"+$(".password").val()); this.options.userModel.fetch({ headers:{ "Authorization":"Basic "+ auth } }) 这是backbone中使用model的fetch api进行ajax请求的例子。在请求之前,我们配置headers字段,设置为base64编码后的auth信息。最后发送请求。 这个http请求头是这样的: ok,到这里我们就成功使用了http basic authorization来向服务器发送请求。 ###3.拓展阅读 《Http权威指南》中有关验证的章节

November 4, 2015

ES6探秘-Classes

ES6中增加了一些新特性,但从底层的角度来说,只是一些语法糖。 但是就我个人来说,如果不了解这些语法糖的本质,是用不安心的。那我们要如何揭开这些语法糖的真实面目呢? Babel to the rescue! Babel是一款将ES6代码转换为ES5代码的编译器,从而让我们可以无视浏览器的支持,直接享受ES6的新特性。同时,我们也可以通过研究Babel编译出的ES5代码,来揭开ES6的面纱。 ...

October 22, 2015