nodefest2014 - transpiler

54
ならば... Node Transpilerをいかに改善できるか。 すべての Node Transpilerひどい

Upload: martin-heidegger

Post on 02-Jul-2015

4.513 views

Category:

Software


0 download

DESCRIPTION

Slides to the presentation that I held on the 2014 NodeFest conference.

TRANSCRIPT

Page 1: NodeFest2014 - Transpiler

ならば... Node Transpilerをいかに改善できるか。

すべての Node Transpilerが がひどい!

Page 2: NodeFest2014 - Transpiler

Source → Source Compiler=

Transpiler

Page 3: NodeFest2014 - Transpiler

Dart TypeScript

CoffeeScript JSX (React)

JSX Browserify

UglifyJS

→ JavaScript

Page 4: NodeFest2014 - Transpiler

→ HTMLEJS

Marked Handlebars

Jade

Page 5: NodeFest2014 - Transpiler

Transpiler

→ CSSLess

Stylus Sass

Page 6: NodeFest2014 - Transpiler

色々あるのに... 皆がよく使っているのに...

なんで悪いの?

Transpiler

Page 7: NodeFest2014 - Transpiler

• パーフォマンス • 設定システム • ノティフィケーション • CLI ごっちゃごっちゃ • 合成

理由がたっぷり

Page 8: NodeFest2014 - Transpiler

Static Site Generator の 待つ時間がながい!

Transpiler パーフォマンス

Page 9: NodeFest2014 - Transpiler

Transpiler パーフォマンス

a-/sync?

Page 10: NodeFest2014 - Transpiler

Transpiler パーフォマンス

SYNC ASYNC IMPORTCoffeeScript ✓ ✕ ✕

CoffeeScript Redux ✓ ✕ ✕

TypeScript ✓ ✕ import x = …

JSX ✓ ✕ import x

JSX (React-tools) ✓ ✕ ✕

Page 11: NodeFest2014 - Transpiler

Transpiler パーフォマンス

smallA.jade

bigA.jade

smallB.jade

bigB.jade

ASYNC smallA.jade bigA.jade smallB.jade bigB.jadeSYNC

例:TypeScript: smallA.ts → bigA.ts + smallB.ts → bigB.ts

Page 12: NodeFest2014 - Transpiler

Transpiler パーフォマンス

SYNC ASYNC IMPORTEJS ✓ ✕ render(…)

Marked ✓ ✕ ✕

Handlebars ✓ ✕ ✕

Jade ✓ ✕ include x

Page 13: NodeFest2014 - Transpiler

Transpiler パーフォマンス

SYNC ASYNC IMPORT

Less ✓ ✓ @import “…”

Stylus ✕ ✓ @import “…”

Sass ✓ ✕ ✕

Node-Sass ✕ ✓ @import “…”

Page 14: NodeFest2014 - Transpiler

Transpiler パーフォマンス

require(“transpiler”); のスピード

Page 15: NodeFest2014 - Transpiler

Transpiler パーフォマンス

CoffeeScript 53msCoffeeScript Redux 63ms TypeScript 55msJSX 235msJSX (React-tools) 75ms

EJS 4ms Marked 5ms Handlebars 24msJade 270ms

Less 131ms Stylus 121ms Sass 3msNode-Sass 13ms

Page 16: NodeFest2014 - Transpiler

Transpiler パーフォマンス

import caching

Page 17: NodeFest2014 - Transpiler

import caching 例

library.jade (120kb)

home.jade (2kb + include library.jade)

team.jade (3kb + include library.jade)

Transpiler パーフォマンス

310ms

10ms

10ms

Page 18: NodeFest2014 - Transpiler

Import Caching (なし)

Transpiler パーフォマンス

home.jade

team.jade

home.jade (2x)

library.jade

library.jade

library.jade

Page 19: NodeFest2014 - Transpiler

Import Caching (あり)

Transpiler パーフォマンス

home.jade

team.jade

home.jade (2x)

library.jade

Page 20: NodeFest2014 - Transpiler

(.........設定システムを検索中です…………………)

Transpiler 設定システム

Page 21: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

設定の名前システム

Page 22: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

- source-map - target-encoding (utf8) - pre/post processing - output file(s) - input files(s)ちなみにI/O piping

- config-check only - import paths - plugins

Page 23: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

- no-header (CoffeeScript) - prefix (Stylus) - inline (Stylus) - strict-math (Less) - url-args (Less) - relative-urls (Less) - doctype (Jade) - obj (Jade)

Page 24: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

Production? Staging? Development?

Page 25: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

- lintのコードスタイル -問題の設定をはすずため - コンパイラバーション

Page 26: NodeFest2014 - Transpiler

Transpiler 設定システム

一般的な設定 言語専用設定 環境設定

(ファイル設定) (ユーザー設定)

-エンバイロンメント変数 -エラー言語(英語・日本語)

Page 27: NodeFest2014 - Transpiler

Transpiler 設定システム

jade --out file.jade

設定入力システム

Page 28: NodeFest2014 - Transpiler

Transpiler 設定システム

jade --conf config.json

{ “output”: “file.jade” }

設定入力システム

Page 29: NodeFest2014 - Transpiler

jade --conf config.yaml

Transpiler 設定システム

output: file.jade

設定入力システム

Page 30: NodeFest2014 - Transpiler

Transpiler 設定システム

env JADE_OUTPUT=file.jade jade

設定入力システム

Page 31: NodeFest2014 - Transpiler

Transpiler 設定システム

jade --conf config.xml

<xml> <output>file.jade</output> </xml>

設定入力システム

Page 32: NodeFest2014 - Transpiler

Transpiler 設定システム

jade --out file.jade --save-conf conf.yaml

設定の保存方法

Page 33: NodeFest2014 - Transpiler

まだ良いほう(?) のwatch

Transpiler ノティフィケーション

Page 34: NodeFest2014 - Transpiler

http://youtu.be/R808-qxBt_E

Page 35: NodeFest2014 - Transpiler

Transpiler ノティフィケーション

test.jade dep.jade

watch: Stage 1 just main file

Page 36: NodeFest2014 - Transpiler

Transpiler ノティフィケーション

test.jade dep.jadedep.jade

watch: Stage 2 import

Page 37: NodeFest2014 - Transpiler

watch: Stage 3 pattern import

Transpiler ノティフィケーション

test.jade dep.jadedep.jade

lib/*.jade

Page 38: NodeFest2014 - Transpiler

Transpiler ノティフィケーション

test.jade dep.jadedep.jade

lib/*.jade

inline.js

watch: Stage 4 cross compiler

Page 39: NodeFest2014 - Transpiler

watch: Stage 3 pattern import

watch: Stage 4 cross compiler

watch: Stage 1 just main file

watch: Stage 2 import

Transpiler ノティフィケーション

test.jade dep.jadedep.jade

lib/*.jade

inline.jsconfig.json

watch: Stage 5 config

Page 40: NodeFest2014 - Transpiler

watch: Stage 3 pattern import

watch: Stage 4 cross compiler

watch: Stage 1 just main file

watch: Stage 2 import

Transpiler ノティフィケーション

test.jade dep.jadedep.jade

lib/*.jade

inline.jsconfig.json

watch: Stage 5 config

watch: Stage 6 piping

test.min.html.gz

compressor

Page 41: NodeFest2014 - Transpiler

coffee --pipe --out

???

Transpiler のCLI ごっちゃごっちゃ

Page 42: NodeFest2014 - Transpiler

Transpiler のCLI ごっちゃごっちゃ

handlebars -d --data lessc --global-var="VAR=VALUE"

jade -O --obj stylus --import

データインポート

Page 43: NodeFest2014 - Transpiler

Transpiler のCLI ごっちゃごっちゃ

coffee --debug ts --noImplicitAny marked --silent

出力の量

Page 44: NodeFest2014 - Transpiler

Transpiler のCLI ごっちゃごっちゃ

引数なし?

REPL? PIPE?

USAGE? ERROR? VERSION?

???

??

Page 45: NodeFest2014 - Transpiler

Transpiler のCLI ごっちゃごっちゃ

エラーコードやフォマッティング

Syntax Error Config Error

Unexpected Error I/O Error

Page 46: NodeFest2014 - Transpiler

Transpiler 合成

<html> <script> → JavaScript Transpiler </script> <style> → CSS Transpiler </style> <body> → HTML Transpiler </body> </html>

var a = “→ HTML Transpiler”, b = “→ CSS Transpiler”, c = → JavaScript Transpiler;

head { … } → CSS Transpiler

index.html main.js

screen.css

Page 47: NodeFest2014 - Transpiler

どうして、 このテーマ?

Page 48: NodeFest2014 - Transpiler

Awareness 認知度

Page 49: NodeFest2014 - Transpiler

Eco-System 生態系

Page 50: NodeFest2014 - Transpiler

Discussion 議論

Page 51: NodeFest2014 - Transpiler

どうして、 私?

Page 52: NodeFest2014 - Transpiler

Martin Heidegger ハイデッガー マルティン

オーストリア(ヨーロッパ)

全般技術社

@leichtgewicht martinheidegger

Page 53: NodeFest2014 - Transpiler

どうして、 今日?

Page 54: NodeFest2014 - Transpiler

github.com/better-compiler/member gitter.im/better-compiler