freakin whitespace, building a javascript style guide

72
FREAKIN' WHITESPACE Building a JavaScript Style Guide

Upload: lizlux

Post on 17-Jun-2015

431 views

Category:

Software


3 download

DESCRIPTION

JavaScript Coding Conventions talk from the HTML5 Dev Conference, May 2014.

TRANSCRIPT

Page 1: Freakin Whitespace, Building a JavaScript Style Guide

FREAKIN'WHITESPACE

Building a JavaScript Style Guide

Page 2: Freakin Whitespace, Building a JavaScript Style Guide

LIZ LEE@lizlux

Front End Engineer @WikiaFront End Coding Conventions Team

Page 3: Freakin Whitespace, Building a JavaScript Style Guide

MY GOALYou too, can have a style guide...

In less than 6 months!

Page 4: Freakin Whitespace, Building a JavaScript Style Guide

"The social universe for fans by fans""Create your own wiki, we'll host it!"

Page 5: Freakin Whitespace, Building a JavaScript Style Guide

AWESOMENESS:Open sourceCommunity driven400k+ wikias100M monthly uniquesRidiculous amounts of knowledge

Page 6: Freakin Whitespace, Building a JavaScript Style Guide

CHALLENGES:Heavily customized MediaWikiScrappy startupGrowth:

2010: 40 Employees2014: 236 Employees600% in 4 years

Page 7: Freakin Whitespace, Building a JavaScript Style Guide
Page 8: Freakin Whitespace, Building a JavaScript Style Guide

Squeaky wheel...... gets to lead the JavaScript Coding Conventions group!

Page 9: Freakin Whitespace, Building a JavaScript Style Guide

OUR MISSION

“ As a developer, I want a clear andwell documented guide covering codingconventions, patterns and best practicesfor JavaScript development at Wikia alongwith tools to help me in making my code

compliant.

Page 10: Freakin Whitespace, Building a JavaScript Style Guide

KEY PRINCIPLES

Page 11: Freakin Whitespace, Building a JavaScript Style Guide

#1: TRUST THE CODE

Page 12: Freakin Whitespace, Building a JavaScript Style Guide

// bad$("#foo").addClass("active");$("#foo").width(200);$("#foo").click();

// bettervar $foo = $("#foo");$foo.addClass("active");$foo.width(200);$foo.click();

// best$("#foo").addClass("active") .width(200) .click();

Page 13: Freakin Whitespace, Building a JavaScript Style Guide

CODE SMELLS"Any symptom in the source code of a program that possibly

indicates a deeper problem" -Wikipedia

Page 14: Freakin Whitespace, Building a JavaScript Style Guide

SMELLSConditional complexityMix-matched white spaceLong methodsLong parameter listsDuplicate codeetc.

Page 15: Freakin Whitespace, Building a JavaScript Style Guide

BROKEN WINDOWS EFFECTCrime begets crime

Smelly code begets smelly code

Page 16: Freakin Whitespace, Building a JavaScript Style Guide

JQUERY OBJECT CACHING$("#foo").addClass("active");$("#foo").width(200);$("#foo").click();

// ...

$("#foo").css('color','blue'); // WTF?!$("#foo").text('derp!'); // >.<

Page 17: Freakin Whitespace, Building a JavaScript Style Guide

"Fool me once..."

Page 18: Freakin Whitespace, Building a JavaScript Style Guide

RULEZ!

https://github.com/Wikia/guidelines/blob/master/JavaScript/CodingConventions.md#caching-jquery-objects

Page 19: Freakin Whitespace, Building a JavaScript Style Guide

MAX PARAMS// smelly!function makeImage(src, width, height, border, type, addedBy) { ... }

makeImages('myImage.gif', '', '', '', '', 'lizlux');

// much betterfunction makeImage(options) { ... }

makeImage({ src: 'myImage.gif', user: 'lizlux'});

Page 20: Freakin Whitespace, Building a JavaScript Style Guide

RULEZ!

https://github.com/Wikia/guidelines/blob/master/JavaScript/CodingConventions.md#maximum-parameters

Page 21: Freakin Whitespace, Building a JavaScript Style Guide

VAR "HOISTING"function foo() { bar(); var x = 1;}

// same asfunction foo() { var x; bar(); x = 1;}

Page 22: Freakin Whitespace, Building a JavaScript Style Guide

Example:var foo = 1;function bar() { if (!foo) { var foo = 10; } alert(foo); // 10}bar();

var foo = 1;function bar() { var foo; // foo is undefined if (!foo) { foo = 10; } alert(foo); // 10}bar();

Page 23: Freakin Whitespace, Building a JavaScript Style Guide

RULEZ!

https://github.com/Wikia/guidelines/blob/master/JavaScript/CodingConventions.md#variables

Page 24: Freakin Whitespace, Building a JavaScript Style Guide

TRUST THE CODE

Page 25: Freakin Whitespace, Building a JavaScript Style Guide

#2: DON'T REINVENT THEWHEEL

Page 26: Freakin Whitespace, Building a JavaScript Style Guide

“ As a developer, I want a clear andwell documented guide covering codingconventions, patterns and best practicesfor JavaScript development at Wikia along

with tools to help me in making my codecompliant.

Page 27: Freakin Whitespace, Building a JavaScript Style Guide

WHAT WE DID WRONG:Wrote all the rules

Then looked at the tools

Page 28: Freakin Whitespace, Building a JavaScript Style Guide

FREAKIN' WHITESPACE!

Page 29: Freakin Whitespace, Building a JavaScript Style Guide

WHITE SPACEWent with jQuery because why not?

Here's why not: eatPreztels( type );

"Function with a callback, object,or array as the last argumenthave no space after the lastargument"

- jQuery Style Guide

eatPretzels( type, function() { return 'Yum!';});

Page 30: Freakin Whitespace, Building a JavaScript Style Guide

MEDIAWIKIeatDoughnuts( type, function() { return flavors['jelly'];} );

Page 31: Freakin Whitespace, Building a JavaScript Style Guide

JSLINT

Page 32: Freakin Whitespace, Building a JavaScript Style Guide

JSLINTCreated by Douglas Crockford, in 2002

“Discovered” JSON (created the spec)Author of JavaScript, The Good Parts

2002 - the wild west of JavaScriptMozilla 1.0NetscapeIE6

Page 33: Freakin Whitespace, Building a JavaScript Style Guide

STYLE RULESStyle rules help us write easy to read, well documented, and

consistent code.

LANGUAGE RULESLanguage rules have an impact on functionality. They were

chosen based on performance implications and theirtendency to reduce bugs.

Page 34: Freakin Whitespace, Building a JavaScript Style Guide

JSLINT STYLE RULESWhitespace set up to read like english:

Spaces go after commas and colons, not beforeSpaces after if while for and function as theywould in EnglishNo space between function name and invokingparentheses

Page 35: Freakin Whitespace, Building a JavaScript Style Guide

BACKINTHEDAYTHEROMANSDIDNTUSESPACESORPUNCTUATIONANDMISUNDERSTANDINGSAROSESOTHEYHADTOINTRODUCETHESECONVENTIONSINTOTHEIRWRITING

Page 36: Freakin Whitespace, Building a JavaScript Style Guide

BACKINTHEDAY THEROMANS DIDNTUSESPA CESOR PUNCTU ATIONANDMISUNDER STANDI NGSA ROSESOTHEYH ADTOINT RODUCETHESECONVE NTIONS INTOTHEIRWRITING

Page 37: Freakin Whitespace, Building a JavaScript Style Guide

Back in the day, the romans didn't use spaces orpunctuation, and misunderstandings arose, so they had to

introduce these conventions into their writing.

Page 38: Freakin Whitespace, Building a JavaScript Style Guide

LANGUAGE RULES

“ If there is a feature of a languagethat is sometimes problematic, and if it

can be replaced with another feature thatis more reliable, then always use the more

reliable feature.

~ Douglas Crockford

Page 39: Freakin Whitespace, Building a JavaScript Style Guide

EQEQ "=="// Bad(foo == 0) // foo can be '', false, 0

// Good(foo === 0) // foo is 0

Page 40: Freakin Whitespace, Building a JavaScript Style Guide

POPULAR CODING CONVENTION ONGITHUB

http://sideeffect.kr/popularconvention/#javascript

Page 41: Freakin Whitespace, Building a JavaScript Style Guide
Page 42: Freakin Whitespace, Building a JavaScript Style Guide
Page 43: Freakin Whitespace, Building a JavaScript Style Guide
Page 44: Freakin Whitespace, Building a JavaScript Style Guide
Page 45: Freakin Whitespace, Building a JavaScript Style Guide
Page 46: Freakin Whitespace, Building a JavaScript Style Guide
Page 47: Freakin Whitespace, Building a JavaScript Style Guide
Page 48: Freakin Whitespace, Building a JavaScript Style Guide

JSLINTCommonly usedIt worksNew employees might already be familiarCode quality tool compatibility

js-beautify: "jslint_happy"JSHint

Page 49: Freakin Whitespace, Building a JavaScript Style Guide

#3: PROGRAMMERS ARE LAZYGood programmers are anyway!

Page 50: Freakin Whitespace, Building a JavaScript Style Guide

TOOLSJSHintJS-BeautifyJSCS

Page 51: Freakin Whitespace, Building a JavaScript Style Guide

It should be harder for us to fail than succeed.Run tools in pre-commit hooksIDE pluginsAuto-updating whitespace for legacy code (js-beautify)Code ClimatePlato

Page 52: Freakin Whitespace, Building a JavaScript Style Guide

JSHINTCreated by Anton Kovalyov in 2010Fork of JSLintCommunity drivenMore configurable and forgiving than JSLint

Page 53: Freakin Whitespace, Building a JavaScript Style Guide

“ Your sadly pathetic bleatings areharshing my mellow.

~ Douglas Crockford

Page 54: Freakin Whitespace, Building a JavaScript Style Guide

“ That is insanely stupid code. I am notgoing to dumb down JSMin for this case.

~ Douglas Crockford

Page 55: Freakin Whitespace, Building a JavaScript Style Guide

JSHINT

Config: .jshintrcIgnore line or file

JSHint.com

Page 56: Freakin Whitespace, Building a JavaScript Style Guide

JS-BEAUTIFYUpdates whitespace for you.Developers are lazy!"jslint_happy"Config: .jsbeautifyrc

Page 57: Freakin Whitespace, Building a JavaScript Style Guide

JSCSJavaScript Code SnifferEnforces whitespace and style rulesCompliments JSHintConfig: .jscs.jsonEx: "requireCurlyBraces" and"requireSpaceAfterKeywords"

Page 58: Freakin Whitespace, Building a JavaScript Style Guide

CODE CLIMATE

Page 59: Freakin Whitespace, Building a JavaScript Style Guide

CODE CLIMATE

Page 60: Freakin Whitespace, Building a JavaScript Style Guide

PLATO

Page 61: Freakin Whitespace, Building a JavaScript Style Guide

SCSS STYLE GUIDE

Page 62: Freakin Whitespace, Building a JavaScript Style Guide

SCSS-LINTOpen source by Causes.comChecks stuff like:

Alphabetizing propertiesWhitespaceSelector depth

Page 63: Freakin Whitespace, Building a JavaScript Style Guide

SMELLY CSS!

Page 64: Freakin Whitespace, Building a JavaScript Style Guide

Duplicate Properties/* bad */h1 { margin: 10px; text-transform: uppercase; margin: 0; // Second declaration}

/* acceptable for handling browser support */.box { background: #fff; background: rgba(255, 255, 255, .5);}

Page 65: Freakin Whitespace, Building a JavaScript Style Guide

Empty Rule/* bad */.cat {}

Page 66: Freakin Whitespace, Building a JavaScript Style Guide

ID With Extraneous Selector/* bad */#submit-button.button { ...}

/* good */#submit-button { ...}

Page 67: Freakin Whitespace, Building a JavaScript Style Guide

Over-specificity & Selector Depth/* bad - SCSS doesn't have to match the HTML structure! */.wrapper { .wrapper-inner { ul { li { a { .submit-button { ... } } } } }}.wrapper .wrapper-inner ul li a .submit-button { ... }

Page 68: Freakin Whitespace, Building a JavaScript Style Guide

Sane Selector Depth/* good - only do what's necessary */.wrapper { .submit-button { ... }}

Page 69: Freakin Whitespace, Building a JavaScript Style Guide

ANALYZE-CSSCreated by MacbreAnalyzes compiled css after preprocessors like SCSS andSASSChecks for duplicate rules due to mixinsGreat for analyzing large code bases

Page 71: Freakin Whitespace, Building a JavaScript Style Guide

OTHER REFERENCEShttp://www.wikia.com/Abouthttp://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.htmlhttps://github.com/twbs/bootstrap/issues/3057#issuecomment-5135512https://www.youtube.com/watch?v=taaEzHI9xyYhttp://anton.kovalyov.net/p/why-jshint/

Page 72: Freakin Whitespace, Building a JavaScript Style Guide

QUESTIONS?liz at lizlux dot net

@lizlux