沐鳴測速註冊_一組網頁邊欄過渡動畫【附源碼下載】

今天我們想與大家分享另一套過渡效果。這一次,我們將探討如何實現側邊欄的過渡動畫,就像我們已經在多級推出菜單中使用的。我們的想法是,以細微的過渡動畫显示一些隱藏的側邊欄,其餘的內容也是。通常側邊欄滑入,把其他內容推到一邊。這個可過程中可以加入很多微妙而奇特的效果,而今天這篇文章能夠給你一些啟示。

溫馨提示:為保證最佳的效果,請在 IE10+、Chrome、Firefox 和 Safari 等現代瀏覽器中瀏覽。

 

 

立即下載      在線演示

沐鳴平台_前端工程師和設計師必讀文章推薦【系列三十五】

這篇文章收集了一組前端開發相關文摘,分享提升網站用戶體驗的優秀 jQuery 插件,展示前沿的 HTML5 和 CSS3 技術應用,共享精美的設計素材和優秀的 Web 開發工具,希望這些精心整理的前端技術文章能夠幫助到您。

HTML5 & CSS3

  • Swiper – 經典的移動觸摸滑塊插件【免費】
  • Kickoff – 創造可擴展的,響應式的網站
  • 16種基於 CSS3 & SVG 的創意的彈窗效果
  • BookBlock – 效果非常真實的書本翻頁預覽
  • 很贊的效果!互動的頁面元素拖放着色實驗
  • SVG Drawing Animation – SVG 繪製動畫
  • Filter Effects – 使用 CSS3 濾鏡處理圖片
  • Space.js – HTML 驅動的頁面 3D 滾動效果
  • Primer – 支撐 GitHub 的 CSS 工具包和準則
  • 贊!15個來自 CodePen 的酷炫 CSS 動畫效果

JS 框架和工具

  • Electron – 創建跨平台的桌面客戶的應用程序
  • Lazyr.js – 延遲加載圖片(Lazy Loading)
  • Rainyday.js – 使用 JavaScript 實現雨滴效果
  • 6to5 – 讓你即刻體驗 ECMAScript 6 編程
  • Dom Animator – 提供 Dom 註釋動畫的 JS 庫
  • Awesomplete – 零依賴的簡單自動完成插件
  • T3 – 構建大型 Web 應用的 JavaScript 框架
  • Restive.js – 輕鬆讓網站變成響應式和自適應
  • BasicModal – 簡單易用的現代 Web App 彈窗
  • Mega Dropdown – 帶子分類的響應式下拉菜單

網站素材

  • EventRay UI Kit – Web & Mobile 的素材
  • 基於 Bootstrap 的響應式後台管理面板
  • 1001Freedownloads – 免費下載海量素材
  • 免費的 Photoshop Apple Watch 原型設計素材
  • 錯誤的藝術!20個創意的404錯誤頁面設計
  • 20個最新的照片 PS 技巧,提升攝影水平

實用工具

  • Pexels Videos – 可以免費商業使用的短視頻
  • Dropplets – 極簡的 Markdown 博客平台
  • Click Magick – 下一代點擊跟蹤和鏈接管理
  • Ratatype – 在線打字教程,提高打字速度
  • Slides – 在線製作效果精美的幻燈片(PPT)

同系列文章

  • Web 前端開發人員和設計師必讀文章推薦【系列一】
  • Web 前端開發人員和設計師必讀文章推薦【系列二】
  • Web 前端開發人員和設計師必讀文章推薦【系列三】
  • Web 前端開發人員和設計師必讀文章推薦【系列四】
  • Web 前端開發人員和設計師必讀文章推薦【系列五】
  • Web 前端開發人員和設計師必讀文章推薦【系列六】
  • Web 前端開發人員和設計師必讀文章推薦【系列七】
  • Web 前端開發人員和設計師必讀文章推薦【系列八】
  • Web 前端開發人員和設計師必讀文章推薦【系列九】
  • Web 前端開發人員和設計師必讀文章推薦【系列十】
  • Web 前端開發人員和設計師必讀文章推薦【系列十一】
  • Web 前端開發人員和設計師必讀文章推薦【系列十二】
  • Web 前端開發人員和設計師必讀文章推薦【系列十三】
  • Web 前端開發人員和設計師必讀文章推薦【系列十四】
  • Web 前端開發人員和設計師必讀文章推薦【系列十五】
  • Web 前端開發人員和設計師必讀文章推薦【系列十六】
  • Web 前端開發人員和設計師必讀文章推薦【系列十七】
  • Web 前端開發人員和設計師必讀文章推薦【系列十八】
  • Web 前端開發人員和設計師必讀文章推薦【系列十九】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十一】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十二】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十三】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十四】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十五】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十六】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十七】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十八】
  • Web 前端開發人員和設計師必讀文章推薦【系列二十九】
  • Web 前端開發人員和設計師必讀文章推薦【系列三十】
  • Web 前端開發人員和設計師必讀文章推薦【系列三十一】
  • Web 前端開發人員和設計師必讀文章推薦【系列三十二】
  • Web 前端開發人員和設計師必讀文章推薦【系列三十三】
  • Web 前端開發人員和設計師必讀文章推薦【系列三十四】

沐鳴怎麼當代理?_JavaScript ES6特性(ECMAScript 6 and ES2015+)

JavaScript在過去幾年發生了很大的變化。 這篇文章整理了 JS 的12個新特性,你今天就開始使用!ES6是JavaScript語言的下一個版本,也稱作 ECMAScript 6 和 ES2015+。ES6中包含了許多新的語言特性,它們將使JS變得更加強大,更富表現力。

JavaScript 歷史

The new additions to the language are called ECMAScript 6. It is also referred as ES6 or ES2015+.

Since JavaScript conception on 1995, it has been evolving slowly. New additions happened every few years. ECMAScript came to be in 1997 to guide the path of JavaScript. It has been releasing versions such as ES3, ES5, ES6 and so on.

As you can see, there are gaps of 10 and 6 years between the ES3, ES5, and ES6. The new model is to make small incremental changes every year. Instead of doing massive changes at once like happened with ES6.

瀏覽器兼容

All modern browser and environments support ES6 already!

source: https://kangax.github.io/compat-table/es6/

Chrome, MS Edge, Firefox, Safari, Node and many others have already built-in support for most of the features of JavaScript ES6. So, everything that you are going to learn in this tutorial you can start using it right now.

Let’s get started with ECMAScript 6!

ES6 核心特性

You can test all these code snippets on your browser console!

So don’t take my word and test every ES5 and ES6 example. Let’s dig in

Block scope variables

With ES6, we went from declaring variables with var to use let/const.

What was wrong with var?

The issue with var is the variable leaks into other code block such as for loops or ifblocks.

ES5

1 2 3 4 5 6 7 8 9 10 11 var x = ‘outer’; function test(inner) { if (inner) { var x = ‘inner’; // scope whole function return x; } return x; // gets redefined because line 4 declaration is hoisted } test( false); // undefined test( true); // inner

For test(false) you would expect to return outer, BUT NO, you get undefined.

Why?

Because even though the if-block is not executed, the expression var x in line 4 is hoisted.

var hoisting:

  • var is function scoped. It is availble in the whole function even before being declared.
  • Declarations are Hoisted. So you can use a variable before it has been declared.
  • Initializations are NOT hoisted. If you are using var ALWAYS declare your variables at the top.
  • After applying the rules of hoisting we can understand better what’s happening:
    ES5
    1 2 3 4 5 6 7 8 9 var x = ‘outer’; function test(inner) { var x; // HOISTED DECLARATION if (inner) { x = ‘inner’; // INITIALIZATION NOT HOISTED return x; } return x; }

ECMAScript 2015 comes to the rescue:

ES6

1 2 3 4 5 6 7 8 9 10 11 let x = ‘outer’; function test(inner) { if (inner) { let x = ‘inner’; return x; } return x; // gets result from line 1 as expected } test( false); // outer test( true); // inner

Changing var for let makes things work as expected. If the if block is not called the variable x doesn’t get hoisted out of the block.

Let hoisting and “temporal dead zone”

  • In ES6, let will hoist the variable to the top of the block (NOT at the top of function like ES5).
  • However, referencing the variable in the block before the variable declaration results in aReferenceError.
  • let is blocked scoped. You cannot use it before it is declared.
  • “Temporal dead zone” is the zone from the start of the block until the variable is declared.

IIFE

Let’s show an example before explaining IIFE. Take a look here:

ES5

1 2 3 4 5 { var private = 1; } console.log(private); // 1

As you can see, private leaks out. You need to use IIFE (immediately-invoked function expression) to contain it:

ES5

1 2 3 4 5 ( function(){ var private2 = 1; })(); console.log(private2); // Uncaught ReferenceError

If you take a look at jQuery/lodash or other open source projects you will notice they have IIFEto avoid polluting the global environment and just defining on global such as _$ orjQuery.

On ES6 is much cleaner, We also don’t need to use IIFE anymore when we can just use blocks and let:

ES6

1 2 3 4 5 { let private3 = 1; } console.log(private3); // Uncaught ReferenceError

Const

You can also use const if you don’t want a variable to change at all.

Bottom line: ditch var for let and const.

  • Use const for all your references; avoid using var.
  • If you must reassign references, use let instead of const.

Template Literals

We don’t have to do more nesting concatenations when we have template literals. Take a look:

ES5

1 2 3 var first = ‘Adrian’; var last = ‘Mejia’; console.log( ‘Your name is ‘ + first + ‘ ‘ + last + ‘.’);

Now you can use backtick (`) and string interpolation ${}:

ES6

1 2 3 const first = ‘Adrian’; const last = ‘Mejia’; console.log( `Your name is ${first} ${last}.`);

Multi-line strings

We don’t have to concatenate strings + \n anymore like this:

ES5

1 2 3 4 5 6 7 8 9 var template = ‘<li *ngFor=”let todo of todos” [ngClass]=”{completed: todo.isDone}” >\n’ + ‘ <div class=”view”>\n’ + ‘ <input class=”toggle” type=”checkbox” [checked]=”todo.isDone”>\n’ + ‘ <label></label>\n’ + ‘ <button class=”destroy”></button>\n’ + ‘ </div>\n’ + ‘ <input class=”edit” value=””>\n’ + ‘</li>’; console.log(template);

On ES6 we can use the backtick again to solve this:

ES6

1 2 3 4 5 6 7 8 9 const template = `<li *ngFor=”let todo of todos” [ngClass]=”{completed: todo.isDone}” > <div class=”view”> <input class=”toggle” type=”checkbox” [checked]=”todo.isDone”> <label></label> <button class=”destroy”></button> </div> <input class=”edit” value=””> </li>`; console.log(template);

Both pieces of code will have exactly the same result.

Destructuring Assignment

ES6 desctructing is very useful and consise. Follow this examples:

Getting elements from an arrays

ES5

1 2 3 4 5 6 var array = [ 1, 2, 3, 4]; var first = array[ 0]; var third = array[ 2]; console.log(first, third); // 1 3

Same as:

ES6

1 2 3 4 5 const array = [ 1, 2, 3, 4]; const [first, ,third] = array; console.log(first, third); // 1 3

Swapping values

ES5

1 2 3 4 5 6 7 8 var a = 1; var b = 2; var tmp = a; a = b; b = tmp; console.log(a, b); // 2 1

same as

ES6

1 2 3 4 5 6 let a = 1; let b = 2; [a, b] = [b, a]; console.log(a, b); // 2 1

Destructuring for multiple return values

ES5

1 2 3 4 5 6 7 8 9 10 function margin() { var left= 1, right= 2, top= 3, bottom= 4; return { left: left, right: right, top: top, bottom: bottom }; } var data = margin(); var left = data.left; var bottom = data.bottom; console.log(left, bottom); // 1 4

In line 3, you could also return it in an array like this (and save some typing):

1 return [left, right, top, bottom];

but then, the caller needs to think about the order of return data.

1 2 var left = data[ 0]; var bottom = data[ 3];

With ES6, the caller selects only the data they need (line 6):

ES6

1 2 3 4 5 6 7 8 function margin() { const left= 1, right= 2, top= 3, bottom= 4; return { left, right, top, bottom }; } const { left, bottom } = margin(); console.log(left, bottom); // 1 4

Notice: Line 3, we have some other ES6 features going on. We can compact { left: left } to just { left }. Look how much concise it is compare to the ES5 version. Isn’t that cool?

Destructuring for parameters matching

ES5

1 2 3 4 5 6 7 8 9 10 var user = { firstName: ‘Adrian’, lastName: ‘Mejia’}; function getFullName(user) { var firstName = user.firstName; var lastName = user.lastName; return firstName + ‘ ‘ + lastName; } console.log(getFullName(user)); // Adrian Mejia

Same as (but more concise):

ES6

1 2 3 4 5 6 7 const user = { firstName: ‘Adrian’, lastName: ‘Mejia’}; function getFullName({ firstName, lastName }) { return `${firstName} ${lastName}`; } console.log(getFullName(user)); // Adrian Mejia

Deep Matching

ES5

1 2 3 4 5 6 7 8 9 function settings() { return { display: { color: ‘red’ }, keyboard: { layout: ‘querty’} }; } var tmp = settings(); var displayColor = tmp.display.color; var keyboardLayout = tmp.keyboard.layout; console.log(displayColor, keyboardLayout); // red querty

Same as (but more concise):

ES6

1 2 3 4 5 6 7 function settings() { return { display: { color: ‘red’ }, keyboard: { layout: ‘querty’} }; } const { display: { color: displayColor }, keyboard: { layout: keyboardLayout }} = settings(); console.log(displayColor, keyboardLayout); // red querty

This is also called object destructing.

As you can see, destructing is very useful and encourages good coding styles.

Best practices:

  • Use array destructing to get elements out or swap variables. It saves you from creating temporary references.
  • Don’t use array destructuring for multiple return values, instead use object destructuring

Classes and Objects

With ECMAScript 6, We went from “constructor functions” to “classes” .

In JavaScript every single object has a prototype, which is another object. All JavaScript objects inherit their methods and properties from their prototype.

In ES5, we did Object Oriented programming (OOP) using constructor functions to create objects as follows:

ES5

1 2 3 4 5 6 7 8 9 10 11 12 var Animal = ( function () { function MyConstructor(name) { this.name = name; } MyConstructor.prototype.speak = function speak() { console.log( this.name + ‘ makes a noise.’); }; return MyConstructor; })(); var animal = new Animal( ‘animal’); animal.speak(); // animal makes a noise.

In ES6, we have some syntax sugar. We can do the same with less boiler plate and new keywords such as class and constructor. Also, notice how clearly we define methodsconstructor.prototype.speak = function () vs speak():

ES6

1 2 3 4 5 6 7 8 9 10 11 class Animal { constructor(name) { this.name = name; } speak() { console.log( this.name + ‘ makes a noise.’); } } const animal = new Animal( ‘animal’); animal.speak(); // animal makes a noise.

As we saw, both styles (ES5/6) produces the same results behind the scenes and are used in the same way.

Best practices:

  • Always use class syntax and avoid manipulating the prototype directly. Why? because it makes the code more concise and easier to understand.
  • Avoid having an empty constructor. Classes have a default constructor if one is not specified.

Inheritance

Building on the previous Animal class. Let’s say we want to extend it and define a Lionclass

In ES5, It’s a little more involved with prototypal inheritance.

ES5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var Lion = ( function () { function MyConstructor(name){ Animal.call( this, name); } // prototypal inheritance MyConstructor.prototype = Object.create(Animal.prototype); MyConstructor.prototype.constructor = Animal; MyConstructor.prototype.speak = function speak() { Animal.prototype.speak.call( this); console.log( this.name + ‘ roars ‘); }; return MyConstructor; })(); var lion = new Lion( ‘Simba’); lion.speak(); // Simba makes a noise. // Simba roars.

I won’t go over all details but notice:

  • Line 3, we explicitly call Animal constructor with the parameters.
  • Line 7-8, we assigned the Lion prototype to Animal‘s prototype.
  • Line 11, we call the speak method from the parent class Animal.

In ES6, we have a new keywords extends and super .

ES6

1 2 3 4 5 6 7 8 9 10 class Lion extends Animal { speak() { super.speak(); console.log( this.name + ‘ roars ‘); } } const lion = new Lion( ‘Simba’); lion.speak(); // Simba makes a noise. // Simba roars.

Looks how legible this ES6 code looks compared with ES5 and they do exactly the same. Win!

Best practices:

  • Use the built-in way for inherintance with extends.

Native Promises

We went from callback hell to promises

ES5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 function printAfterTimeout(string, timeout, done){ setTimeout( function(){ done(string); }, timeout); } printAfterTimeout( ‘Hello ‘, 2e3, function(result){ console.log(result); // nested callback printAfterTimeout(result + ‘Reader’, 2e3, function(result){ console.log(result); }); });

We have one function that receives a callback to execute when is done. We have to execute it twice one after another. That’s why we called the 2nd time printAfterTimeout in the callback.

This can get messy pretty quickly if you need a 3rd or 4th callback. Let’s see how we can do it with promises:

ES6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function printAfterTimeout(string, timeout){ return new Promise( (resolve, reject) => { setTimeout( function(){ resolve(string); }, timeout); }); } printAfterTimeout( ‘Hello ‘, 2e3).then( (result) => { console.log(result); return printAfterTimeout(result + ‘Reader’, 2e3); }).then( (result) => { console.log(result); });

As you can see, with promises we can use then to do something after another function is done. No more need to keep nesting functions.

Arrow functions

ES6 didn’t remove the function expressions but it added a new one called arrow functions.

In ES5, we have some issues with this:

ES5

1 2 3 4 5 6 7 8 9 var _this = this; // need to hold a reference $( ‘.btn’).click( function(event){ _this.sendData(); // reference outer this }); $( ‘.input’).on( ‘change’, function(event){ this.sendData(); // reference outer this }.bind( this)); // bind to outer this

You need to use a temporary this to reference inside a function or use bind. In ES6, you can use the arrow function!

ES6

1 2 3 4 5 6 // this will reference the outer one $( ‘.btn’).click( (event) => this.sendData()); // implicit returns const ids = [ 291, 288, 984]; const messages = ids.map( value => `ID is ${value}`);

For…of

We went from for to forEach and then to for...of:

ES5

1 2 3 4 5 6 7 8 9 10 11 // for var array = [ ‘a’, ‘b’, ‘c’, ‘d’]; for ( var i = 0; i < array.length; i++) { var element = array[i]; console.log(element); } // forEach array.forEach( function (element) { console.log(element); });

The ES6 for…of also allow us to do iterations.

ES6

1 2 3 4 5 // for …of const array = [ ‘a’, ‘b’, ‘c’, ‘d’]; for ( const element of array) { console.log(element); }

Default parameters

We went from checking if the variable was defined to assign a value to default parameters. Have you done something like this before?

ES5

1 2 3 4 5 6 7 8 9 10 11 function point(x, y, isFlag){ x = x || 0; y = y || -1; isFlag = isFlag || true; console.log(x,y, isFlag); } point( 0, 0) // 0 -1 true point( 0, 0, false) // 0 -1 true point( 1) // 1 -1 true point() // 0 -1 true

Probably yes, it’s a common pattern to check is the variable has a value or assign a default. Yet, notice there are some issues:

  • Line 8, we pass 0, 0 and get 0, -1
  • Line 9, we pass false but get true.

If you have a boolean as a default parameter or set the value to zero, it doesn’t work. Do you know why??? I’ll tell you after the ES6 example

With ES6, Now you can do better with less code!

ES6

1 2 3 4 5 6 7 8 function point(x = 0, y = -1, isFlag = true){ console.log(x,y, isFlag); } point( 0, 0) // 0 0 true point( 0, 0, false) // 0 0 false point( 1) // 1 -1 true point() // 0 -1 true

Notice line 5 and 6 we get the expected results. The ES5 example didn’t work. We have to check for undefined first since falsenullundefined and 0 are falsy values. We can get away with numbers:

ES5

1 2 3 4 5 6 7 8 9 10 11 function point(x, y, isFlag){ x = x || 0; y = typeof(y) === ‘undefined’ ? -1 : y; isFlag = typeof(isFlag) === ‘undefined’ ? true : isFlag; console.log(x,y, isFlag); } point( 0, 0) // 0 0 true point( 0, 0, false) // 0 0 false point( 1) // 1 -1 true point() // 0 -1 true

Now it works as expected when we check for undefined.

Rest parameters

We went from arguments to rest parameters and spread operator.

On ES5, it’s clumpsy to get an arbitrary number of arguments:

ES5

1 2 3 4 5 6 7 function printf(format) { var params = [].slice.call( arguments, 1); console.log( ‘params: ‘, params); console.log( ‘format: ‘, format); } printf( ‘%s %d %.2f’, ‘adrian’, 321, Math.PI);

We can do the same using the rest operator ....

ES6

1 2 3 4 5 6 function printf(format, …params) { console.log( ‘params: ‘, params); console.log( ‘format: ‘, format); } printf( ‘%s %d %.2f’, ‘adrian’, 321, Math.PI);

Spread operator

We went from apply() to the spread operator. Again we have ... to the rescue:

Reminder: we use apply() to convert an array into a list of arguments. For instance,Math.max() takes a list of parameters, but if we have an array we can use apply to make it work.

As we saw in earlier, we can use apply to pass arrays as list of arguments:

ES5

1 Math.max.apply( Math, [ 2, 100, 1, 6, 43]) // 100

In ES6, you can use the spread operator:

ES6

1 Math.max(…[ 2, 100, 1, 6, 43]) // 100

Also, we went from concat arrays to use spread operator:

ES5

1 2 3 4 5 var array1 = [ 2, 100, 1, 6, 43]; var array2 = [ ‘a’, ‘b’, ‘c’, ‘d’]; var array3 = [ false, true, null, undefined]; console.log(array1.concat(array2, array3));

In ES6, you can flatten nested arrays using the spread operator:

ES6

1 2 3 4 5 const array1 = [ 2, 100, 1, 6, 43]; const array2 = [ ‘a’, ‘b’, ‘c’, ‘d’]; const array3 = [ false, true, null, undefined]; console.log([…array1, …array2, …array3]);

沐鳴:_Seen.js – 使用 SVG & Canvas 渲染 3D 場景

Seen.js 渲染3D場景為 SVG 或者 HTML5 畫布。Seen.js 包含對於 SVG 和 HTML5 Canvas 元素的圖形功能的最簡單的抽象。所有這個庫的其它組件都是不用關心將要渲染的上下文的類型。

 

官方網站      立即下載

沐鳴平台首頁_新手入門指導:Vue 2.0 的建議學習順序

起步

1. 紮實的 JavaScript / HTML / CSS 基本功。這是前置條件。

2. 通讀官方教程 (guide) 的基礎篇。不要用任何構建工具,就只用最簡單的 <script>,把教程里的例子模仿一遍,理解用法。不推薦上來就直接用 vue-cli 構建項目,尤其是如果沒有 Node/Webpack 基礎。

3. 照着官網上的示例,自己想一些類似的例子,模仿着實現來練手,加深理解。

4. 閱讀官方教程進階篇的前半部分,到『自定義指令 (Custom Directive) 』為止。着重理解 Vue 的響應式機制和組件生命周期。『渲染函數(Render Function)』如果理解吃力可以先跳過。

5. 閱讀教程里關於路由和狀態管理的章節,然後根據需要學習 vue-router 和 vuex。同樣的,先不要管構建工具,以跟着文檔里的例子理解用法為主。
6. 走完基礎文檔后,如果你對於基於 Node 的前端工程化不熟悉,就需要補課了。下面這些嚴格來說並不是 Vue 本身的內容,也不涵蓋所有的前端工程化知識,但對於大型的 Vue 工程是前置條件,也是合格的『前端工程師』應當具備的知識。

前端生態/工程化

1. 了解 JavaScript 背後的規範,ECMAScript 的歷史和目前的規範制定方式。學習 ES2015/16 的新特性,理解 ES2015 modules,適當關注還未成為標準的提案

2. 學習命令行的使用。建議用 Mac。

3. 學習 Node.js 基礎。建議使用 nvm 這樣的工具來管理機器上的 Node 版本,並且將 npm 的 registry 註冊表配置為淘寶的鏡像源至少要了解 npm 的常用命令,npm scripts 如何使用,語義化版本號規則,CommonJS 模塊規範(了解它和 ES2015 Modules 的異同),Node 包的解析規則,以及 Node 的常用 API。應當做到可以自己寫一些基本的命令行程序。注意最新版本的 Node (6+) 已經支持絕大部分 ES2015 的特性,可以藉此鞏固 ES2015。

4. 了解如何使用 / 配置 Babel 來將 ES2015 編譯到 ES5 用於瀏覽器環境。

5. 學習 Webpack。Webpack 是一個極其強大同時也複雜的工具,作為起步,理解它的『一切皆模塊』的思想,並基本了解其常用配置選項和 loader 的概念/使用方法即可,比如如何搭配 Webpack 使用 Babel。學習 Webpack 的一個挑戰在於其本身文檔的混亂,建議多搜索搜索,應該還是有質量不錯的第三方教程的。英文好的建議閱讀 Webpack 2.0 的文檔,比起 1.0 有極大的改善,但需要注意和 1.0 的不兼容之處

Vue 進階

1. 有了 Node 和 Webpack 的基礎,可以通過 vue-cli 來搭建基於 Webpack ,並且支持單文件組件的項目了。建議用 webpack-simple 這個模板開始,並閱讀官方教程進階篇剩餘的內容以及 vue-loader 的文檔,了解一些進階配置。有興趣的可以自己親手從零開始搭一個項目加深理解。

2. 根據 例子 嘗試在 Webpack 模板基礎上整合 vue-router 和 vuex
3. 深入理解 Virtual DOM 和『渲染函數 (Render Functions)』這一章節(可選擇性使用 JSX),理解模板和渲染函數之間的對應關係,了解其使用方法和適用場景。

4. (可選)根據需求,了解服務端渲染的使用(需要配合 Node 服務器開發的知識)。其實更重要的是理解它所解決的問題並搞清楚你是否需要它。
5. 閱讀開源的 Vue 應用、組件、插件源碼,自己嘗試編寫開源的 Vue 組件、插件。

6. 參考 貢獻指南 閱讀 Vue 的源碼,理解內部實現細節。(需要了解 Flow

7. 參与 Vue GitHub issue 的定位 -> 貢獻 PR -> 加入核心團隊 -> 升任 CTO -> 迎娶白富美…(誤

沐鳴平台首頁_35個讓人驚訝的 CSS3 動畫效果演示

本文收集了35個驚人的 CSS3 動畫演示,它們將證明 CSS3 Transform 和 Transition 屬性的強大能力。CSS 是網頁設計非常重要的一部分,隨着越來越多的瀏覽器對 CSS3 支持的不斷完善,設計師和開發者們有了更多的選擇。如今,用純 CSS 就可以實現各種各樣很酷的效果,甚至是動畫。

1. Pure CSS Coke Can

 

 

2. Colorful Clock

 

 

3. jQuery DJ Hero

 

 

4. Animated Pricing Column

 

 

5. Slick jQuery Menu

 

 

6. Frame-by-Frame Animation (Hover to Play)

 

 

7. AT-AT Walker

 

 

8. Contextual Slideout Tips With jQuery & CSS3

 

 

9. CSS3 & jQuery Slide Out Button

 

 

10. A Fresh Bottom Slide Out Menu with jQuery

 

 

11. Drop-In Modals

 

 

12. CSS3 Lightbox Gallery With jQuery

 

 

13. Easily Turn Your Images Into Polaroids with CSS3

 

 

14. Beautiful Looking Custom Dialog Box With jQuery and CSS3

 

 

15. Cross-Browser Rounded Buttons with CSS3 and jQuery

 

 

16. CSS3 DropDown Menu

 

 

17. CSS3 Search Form

 

 

18. CSS3 Dynamic Shadow

 

 

19. CSS3 Music Player Menu

 

 

20. Elastic Thumbnail Menu

 

 

21. Create Depth And Nice 3D Ribbons Only Using CSS3

 

 

22. CSS3 Chunky Menu

 

 

23. CSS3-only horizontal drop line tab menu

 

 

24. javascript-effect alternatives using CSS3 for webkit browsers

 

 

25. CSS3 Flying Menu

 


夢想天空關注前端開發,展示HTML5和CSS3應用,分享jQuery插件,推薦優秀網頁設計案例。  

26. Twitter-like Input Using CSS3

 

 

27. Animated wicked CSS3 3d bar chart

 

 

28. Wicked CSS3 3d bar chart

 

 

29. Pure CSS3 bokeh effect

 

 

30. Query & CSS3 Gallery With Animated Shine Effects

 

 

31. Interactive Image Vamp up with jQuery, CSS3 and PHP

 

 

32. How to Create a “Stay-On-Top” Menu with CSS3 and jQuery

 

 

33. Halftone Navigation Menu With jQuery & CSS3

 

 

34. 3D Meninas

 

 

35. Sliding Vinyl

 

 

36. Spotlight Cast Shadow

 

沐鳴:_20個不可思議的 WebGL 示例和演示

WebGL 是一項在網頁瀏覽器呈現3D畫面的技術,有別於過去需要安裝瀏覽器插件,通過 WebGL 的技術,只需要編寫網頁代碼即可實現3D圖像的展示。WebGL 可以為 Canvas 提供硬件3D加速渲染,這樣 Web 開發人員就可以藉助系統顯卡來在瀏覽器里更流暢地展示3D場景和模型了。

在這篇文章中20個不可思議的 WebGL 示例來增強你對於這個新技術的理解。

1. Aquarium

Image Source:www.webglsamples.org

Created by Greggman and Human Engines. The aquarium runs almost entirely based on a clock.That means the position of the camera and every fish will be the same across machines if their clocks are in sync. When in networked mode each machine keeps its clock in sync by periodically asking the server for the current time.

2. 3 Dreams of Black

Image Source:www.ro.me

A Semi-Intereactive film authored by Chris Milk. It was developed using technology developed by Google and other sources.

It works with chrome mixing 2D and 3D computer graphics, showcasing the song “Black” by Danger Mouse and Daniel Luppi ,with Norah Jones and Jack White.

3. Cube

Image Source:www.playmapscube.com

A WebGL innovative game inspired with Google maps technology. It consists of elements you see in Google Maps and analog labyrinth games combined with amazing controls that can break an experience.

4. Chemdoodle

Image Source:www.web.chemdoodle.com

Chemdoodle is a scientific visualization which lets you pick one of a number of medicines and see a 3D display of its chemical structure on compatible browsers, developed by iChemLabs.

5. Chrysaora

Image Source:www.aleksandarrodic.com

A dynamic Jellyfish WebGL demo built with Vladimir Vuki?evi?’s mjs matrix library. It showcases simulated skeletons, partial server-side simulation and synchronization with WebSocket, and camera facing a particle system and volumetric light effect.

6. WebGL Bookcase

Image Source:www.workshop.chromeexperiments.com

Google Books’ new flashy interface styled after a helix. Within the spiral books are sorted by subject and clicking on any book takes you to the entry in Google Books.

7. Just a Reflektor

Image Source:www.justareflektor.com

Just a Reflektor is a band Arcade Fire music video which was collaborated by Google. Using your mouse you can adjust various real-time filters and effects. This WebGL will require a webcam or simply your mouse.

8. WebGL Earth

Image Source:www.webglearth.com

An open source software enabling exploration, zooming and “playing” with the 3D globe in a web browser. The project is sustained through the support and cooperation of the developer community.

9. 3Dtin

Image Source:www.3dtin.com

3Dtin is an easy to use tool for creating shapes with a natural voxel-oriented 3D pixel approach, with the feature to export your project in 3D printing services.

10. The Biodigital Human

Image Source:www.biodigitalhuman.com

The BioDigital Human is a virtual 3D body that brings to life thousands of medically accurate anatomy objects and health conditions, in an interactive Web-based platform.

11. WebGL Rubik’s Cube

Image Source:www.randelshofer.ch

A Rubik’s Cube applets from Java to WebGL developed by Werner Randelshofer. Parts of the code are from the WebGL demo repository. Codes use in this WebGL are copyrighted by Apple Inc. and by Google Inc. and is used under permission.

12. GLGE

Image Source:www.glge.org

A framework for making WebGL developed by by Paul Brunt. It is a javascript library intended to ease the use of WebGL; which is basically a native browser javascript API giving direct access to openGL ES2, allowing for the use of hardware accelerated 2D/3D applications without having to download any plugins.

13. Ctrl+[P]aper

Image Source:www.grouek.com

Digital studio Grouek designed this Web GL website, that allows anyone to create its paper toy in 3 easy steps. Once you’re done, print the PDF, cut, fold and glue following instructions. In less time than you think, a beautiful, unique, self-created paper toy will proudly stand on your desktop.

14. A holiday message

Image Source:www.itsamessage.com

Developed by @thespite and @mrdoob. It will first require you to put on your address before proceeding. Once entered you’ll see a beautiful 3D scene that has a holiday greetings on it, where as you can move along using your mouse to view the whole 3D models.

15. Materials: Cars

Image Source:www.alteredqualia.com

With this WebGL you can choose to view 3D looks of Bugatti Veyron, Lamborghini Gallardo, Ferrari F50 and Chevrolet Camaro in your browser. Pick your ride and enjoy the view. Guest what, you can even choose their colors.

16. Quake 3

Image Source:www.media.tojicode.com

Developed by Brandon Jones, it is an impressive WebGL game demo complete with music. You can play it by just using your keyboard and mouse.

17. WebGL Image Filter

Image Source:www.evanw.github.io

A WebGL graphic editor application by Evan Wondrasek ,with a smooth and fast interface. You can play around with filter effects like the brightness and contrast, similar to the features you see in Photoshop.

18. From Dust

Image Source:www.bing.com

A WebGL game originally released a couple years ago on some traditional gaming platforms. Ubisoft has ported this game to WebGL and contains amusing and amazing effects and controls on it.

19. Acko.net

Image Source:www.acko.net

A WebGL that offers 3D logo on the header with a basic setting of a site when scrolled down. It offers a possibility that WebGL can be used as a practical setting to a website or software application.

20. WebGL Terrain

Image Source:www.alteredqualia.com

A WebGL demo with dynamic procedural terrain using 3d simplex nois. It features birds from ro.me and the background sound by Kevin Maclead.

沐鳴平台首頁_Muse UI — Vue2.0 和 Material Design 結合

Vue 2.0 發布以來,很多 vue 的開源項目都開始了升級計劃,我也思考着 vue-carbon 的升級之路,9月開工,11月完工, Muse UI 閃亮登場。

先睹為快

Muse UI 主要用於移動端和一些對瀏覽器兼容性要求不高的桌面端應用,先上地址:

https://github.com/museui/muse-ui

官網和文檔在這:

https://museui.github.io/

特性

  • 基於 vue2.0 開發

  • 組件豐富

  • 豐富的主題,支持自定義主題

  • 可以很好的配合 vue 的其它插件vue-router , vue-validator 使用

  • 友好的 API

使用

npm install muse-ui --save

完整引入

import Vue from 'vue'
import MuseUI from 'muse-ui'
import 'muse-ui/dist/muse-ui.css'
Vue.use(MuseUI)

按需引入

首先需要需要修改 webpack 的配置

{
  // ...
  module: {
    loaders: [
      {
        test: /muse-ui.src.*?js$/,
        loader: 'babel'
      }
    ]
  },
  resolve: {
    // ...
    alias: {
      'muse-components': 'muse-ui/src'
    }
  }
}

main.js

import Vue from 'vue'
import 'muse-components/style/base.less' // 全局樣式包含 normalize.css
import appbar from 'muse-components/appbar'
import avatar from 'muse-components/avatar'
import {bottomNav, bottomNavItem} from 'muse-components/bottomNav'
import {retina} from 'muse-components/utils'

retina() // 1px 處理方案

// ...
Vue.component(appbar.name, appbar)
Vue.component(avatar.name, avatar)
Vue.component(bottomNav.name, bottomNav)
Vue.component(bottomNavItem.name, bottomNavItem)

示例 bottomNav 的使用

<template>
 <mu-bottom-nav :value="bottomNav" shift @change="handleChange">
    <mu-bottom-nav-item value="movies" title="Movies" icon="ondemand_video"/>
    <mu-bottom-nav-item value="music" title="Music" icon="music_note"/>
    <mu-bottom-nav-item value="books" title="Books" icon="books"/>
    <mu-bottom-nav-item value="pictures" title="Pictures" icon="photo"/>
</mu-bottom-nav>
</template>
<script>
export default {
  data () {
    return {
      bottomNav: 'movies'
    }
  },
  methods: {
    handleChange (val) {
      this.bottomNav = val
    }
  }
}
</script>

關於 Muse

為了配合Vue 2.0 改變了 vue-carbon 許多的 API,新增了許多的組件,由於改變的太多,於是更名為 Muse UI,做為一個全新的 UI 框架。

Muse 取自於古希臘神話中的女神,掌管科學與藝術。我希望 Muse 和 Vue 一樣能將科學與藝術完美的結合。

後續的工作

為了跟隨 Vue 2.0, Muse 以 2.0 版本為基礎,現在是 alpha 版,後續會不斷完善。

[ ] 修復現有的問題和合理化API

[ ] 增加單元測試

[ ] 增加更多快捷操作的api (簡單的消息提示,alert, confirm 等等)

[ ] 增加其它的功能性組件(Notification, Pagination 等等)

[ ] 開發 weex 版的 muse

沐鳴登錄平台_提高Node.js應用吞吐量的小優化技巧

內容提點

  • 盡可能地使用聚合IO操作,以批量寫的方式來最小化系統調用的次數。
  • 需要將發布的開銷考慮進內,清除應用中不同的定時器。
  • CPU分析器能夠給你提高一些有用信息,但是並不能完整地反饋整個流程。
  • 謹慎使用ECMAScript高級語法,特別是你還未使用最新的JavaScript引擎或者類似於Babel這樣的轉換器的時候。
  • 要洞察你的依賴樹的組成並且對你使用的依賴進行適當的性能評測

當我們希望去優化某個包含了IO功能的應用性能時,我們需要對於應用耗費的CPU周期以及那些妨礙到應用并行化執行的因素了如指掌。本文則是分享我在提升Apache Cassandra項目中的DataStax Node.js 驅動時的一些思考與總結出的導致應用吞吐量降級的關鍵因素。

背景

Node.js使用的標準JavaScript引擎V8會將JavaScript代碼編譯為機器碼然後以本地代碼的方式運行。V8引擎使用了如下三個組件來同時保證較低的啟動時間與最佳性能表現:

  • 能夠快速將JavaScript代碼編譯為機器碼的通用編譯器。
  • 能夠自動追蹤應用中代碼執行時間並且決定應該優化哪些代碼模塊的運行時分析器。
  • 能夠自動優化被分析器標註的待優化代碼的優化編譯器;並且如果操作被認為是過優化,該編譯器還能自動地進行逆優化操作。

儘管優化編譯器能夠保證最佳的性能表現,但是它並不會對所有的代碼進行優化,特別是那些不合適的代碼編寫模式。你可以參考來自Google Chrome DevTools團隊的建議來了解哪些代碼模式是V8拒絕優化的,典型的包括:

  • 包含try-catch語句的函數
  • 使用arguments對象對函數參數進行重新賦值

雖然優化編譯器能夠顯著提升代碼允許速度,但是對於典型的IO密集型的應用,大部分的性能優化還是依賴於指令重排以及避免高佔用的調用來提高每秒的操作執行數目;這也會是我們在接下來的章節中需要討論的部分。

測試基準

為了能夠更好地發現那些可以惠及最多用戶的優化技巧,我們需要模擬真實用戶場景,根據常用任務執行的工作量來定義測試基準。首先我們需要測試API入口點的吞吐量與時延;除此之外如果希望獲取更多的信息,你也可以選擇對於內部調用方法進行性能評測。推薦使用process.hrtime()來獲取實時解析與執行時長。雖然可能會對項目開發造成些許不便,但我還是建議盡可能早地在開發周期中引入性能評測。可以選擇先從一些方法調用進行吞吐量測試,然後再慢慢地增加譬如時延分佈這些相對複雜的測試。

CPU 分析

目前有多種CPU分析器可供我們使用,其中Node.js本身提供的開箱即用的CPU分析器已經能應付大部分的使用場景。內建的Node.js分析器源於V8內置的分析器,它能夠以固定地頻率對棧信息進行採樣;你可以在運行node命令時使用--prof參數來創建V8標記文件。然後你可以對分析結果進行聚合轉化處理,通過使用--prof-process參數將其轉化為可讀性更好的文本:

$ node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt

在編輯器中打開經過處理的記錄文件,你可以看到整個記錄被劃分為了部分,首先我們來看下Summary部分,其格式如下所示:

 [Summary]:

  ticks   total   nonlib  name

  20109   41.2%   45.7%  JavaScript

  23548   48.3%   53.5%  C++

    805    1.7%    1.8%  GC

   4774    9.8%          Shared libraries

    356    0.7%          Unaccounted

上面的值分別代表了在JavaScript/C++代碼以及垃圾收集器中的採樣頻次,其會隨着分析代碼的不同而變化。然後你可以根據需要分別查看具體的子部分(譬如[JavaScript], [C++], …)來了解具體的採樣信息。除此之外,分析文件中還包含一個叫做[Bottom up (heavy) profile]的非常有用的部分,它以樹形結構展示了買個函數的調用者,其基本格式如下:

223  32%      LazyCompile: *function1 lib/file1.js:223:20

221  99%        LazyCompile: ~function2 lib/file2.js:70:57

221  100%         LazyCompile: *function3 /lib/file3.js:58:74

上面的百分比代表該層調用者占目標函數所有調用者數目的比重,而函數之前的星號意味着該函數是經過優化處理的,而波浪號代表該函數是未經過優化的。在上面的例子中,function199%的調用是由function2發起的,而function3佔據了function2100%的調用佔比。CPU 分析結果與火焰圖是非常有用的分析棧佔用與CPU耗時的工具。不過需要注意的是,這些分析結果並不意味着全部,大量的異步IO操作會讓分析變得不那麼容易。

系統調用

Node.js利用Libuv提供的平台無關的接口來實現非阻塞型IO,應用程序中所有的IO操作(sockets, 文件系統, …)都會被轉化為系統調用。而調度這些系統調用會耗費大量的時間,因此我們需要盡可能地聚合IO操作,以批量寫的方式來最小化系統調用的次數。具體而言,我們應該將Socket或者文件流放入到緩衝中然後一次性處理而不是對每個操作進行單獨處理。你可以使用寫隊列來管理你的所有寫操作,常用的寫隊列的實現邏輯如下:

  • 當我們需要進行寫操作並且在某個處理窗口期內:
    • 將該緩衝區添加到待寫列表中
  • 連接所有的緩衝區並且一次性的寫入到目標管道中。

你可以基於總的緩衝區長度或者第一個元素進入隊列的時間來定義窗口尺寸,不過在定義窗口尺寸時我們需要權衡考慮單個寫操作的時延與整體寫操作的時延,不能厚此薄彼。你也需要同時考慮能夠聚合的寫操作的最大數目以及單個寫請求的開銷。你可能會以千字節為單位決定一個寫隊列的上限,我們的經驗發現8千字節左右是個不錯的臨界點;當然根據你應用的具體場景這個值肯定會有變化,你可以參考我們的這個寫隊列的完整實現。總結而言,當我們採用了批量寫之後系統調用的數目大大降低了,最終提升了應用的整體吞吐量。

Node.js 定時器

Node.js中的定時器與window中的定時器具有相同的API,可以很方便地實現簡單的調度操作;在整個生態系統中有很廣泛的應用,因此我們的應用中可能充斥着大量的延時調用。類似於其他基於散列的輪轉調度器,Node.js使用散列表與鏈表來維護定時器實例。不過有別於其他的輪轉調度器,Node.js並沒有維持固定長度的散列表,而是根據觸發時間對定時器建立索引。添加新的定時器實例時,如果Node.js發現已經存在了相同的鍵值(有相同觸發事件的定時器),那麼會以O(1)複雜度完成添加操作。如果還不存在該鍵值,則會創建新的桶然後將定時器添加到該桶中。需要銘記於心的是,我們應該盡可能地重用已存在的定時器存放桶,避免移除整個桶然後再創建一個新的這種耗時的操作。舉例而言,如果你使用滑動延時,那麼應該在使用clearTimeout()移除定時器之前使用setTimeout()創建新的定時器。我們對於心跳包的處理中在移除上一個定時器之前會先確定下以O(1)複雜度調度空閑的定時器。

Ecmascript 語言特性

當我們着眼於整體的性能保障時,我們需要避免使用部分Ecmascript中的高級語言特性,典型的譬如:Function.prototype.bind(), Object.defineProperty() 以及 Object.defineProperties()。我們可以在JavaScript引擎的實現描述或者問題中發現這些特性的性能缺陷所在,譬如Improvement in Promise performance in V8 5.3 以及 Function.prototype.bind performance in V8 5.4。另外你也需要謹慎使用ES2015或者ESNext中的新的語言特性,它們相較於ECMAScript 5中的語法會慢很多。six-speed 項目網站就追蹤了這些語言特性在不同的JavaScript引擎上的性能表現,如果你尚未發現某些特性的性能評測你也可以自己進行一些測試。V8 團隊也一直致力於提高新的語言特性的性能表現,最終使其與底層實現保持一致。我們可以在性能規劃中隨時了解他們對於ES2015性能優化的工作進展,這裏他們會收集使用者對於提升點的建議並且發布新的設計文檔來闡述他們的解決方案。你也可以在這個博客隨時了解V8的實現進展,不過考慮到V8的提升可能需要較長的時間才能合併入LTS版本的Node.js: 根據LTS規劃只有在Node.js大版本迭代時才會合併進最新的V8版本。你可能要等待6-12月才能發現新的V8引擎被合併進入Node.js的運行環境中,而目前Node.js的新的發布版本只會包含V8引擎中的部分修復。

依賴

Node.js 運行時為我們提供了完整的IO操作庫,但是ECMAScript語法標準則僅提供了寥寥無幾的內建數據類型,很多時候我們不得不依賴第三方的庫來進行某些基本任務。沒有人能保證這些第三方的庫可以準確高效地工作,即使那些流行的明星模塊也可能存在問題。Node.js的生態系統是如此的繁榮茂盛,可能很多依賴模塊中只包含幾個你自己很方便就能實現的方法。我們需要在重複造輪子的代價與依賴帶來的性能不可控之間做一個權衡。我們團隊會盡可能地避免引入新的依賴,並且對所有的依賴持保守態度。不過對於bluebird這樣本身發布了可信賴的性能評測的庫我們是很歡迎的。我們的項目中使用async來處理異步操作,在代碼庫中廣泛地使用了async.series(), async.waterfall() 以及 async.whilst()。確實我們很難說這樣連接了多個層次的異步處理庫就是性能受損的罪魁禍首,幸好有很多其他開發者定位了其中存在的問題。我們也可以選擇類似於neo-async這樣的替代庫,它的運行效率明顯提高並且也有公開的性能評測結果。

總結

本文中提及的優化技巧有的屬於常識,有的則是涉及到Node.js生態系統以及JavaScript核心引擎的實現細節與工作原理。在我們開發的客戶端驅動中,通過引入這些優化手段我們達成了兩倍的吞吐量的提升。考慮到我們的Node.js應用以單線程方式運行,我們應用佔據CPU的時間片與指令的排布順序會大大影響整體的吞吐量與高平行的實現程度。

關於作者

Jorge Bay是Apache Cassandra項目中Node.js以及C#客戶端驅動的核心工程師,同時還是DataStax的DSE。他樂於解決問題與提供服務端解決方案,Jorge擁有超過15年的專業軟件開發經驗,他為Apache Cassandra實現的Node.js客戶端驅動同樣也是DataStax官方驅動的基礎

沐鳴總代理_axios – 基於 Promise 的 HTTP 異步請求庫

axios 是基於 Promise 的 HTTP 請求客戶端,可同時在瀏覽器和 node.js 中使用。Vue 更新到2.0之後,作者就宣告不再對 vue-resource 模塊更新,而是推薦使用 axios 來處理 HTTP 請求。

在線演示      免費下載