- はじめに
- 会場
- Keynote. Learn as I write the Docs
- 2. Serverless is your BFF
- 3. Entropic package registry
- 4. Redux Based Modular Design
- 5. Diving into TypeScript design metadata with NestJS
- 6. Writing code to refactor code
- 7. JavaScript 的执行 & 性能
- 8. 去除迷雾, 漫谈 WebAssembly
- Panel discussion
はじめに
こちらも途中ですが、 JSConf China 2019 2日目の内容をメモっておきます。
※ 2019/11/09 会場でメモった内容をほぼそのまま書いています。
意味不明な部分や聞き間違い、解釈違いなど多数あると思います。
もうすぐ資料や動画が配信されるはずなので、その後更新する予定です。
会場
- 9:55開始
- 開場時点での参加者数は昨日より少ない。
- チケットのやりとりで Keynote に間に合わないのを恐れたため?(つまり自分と一緒)
- 開始時点でも昨日より少なかった(昨日飲みすぎ?)
- PC自体は共通のMacを使ってるっぽい
- 中国語セッションは 3/8
0. Opening
- 開発者同士の交流、ということを再度強調
Keynote. Learn as I write the Docs
資料
昨日のSessionについて
- 各Sessionの良いところをかんたんな概要に触れながら。
フロントエンド、React を学んできた4年間
- 新しい技術にふれるとき、たくさんのDocsを読むことになる
4 years as Front End
- 最初は何もわからなくてもとにかく楽しかった。
- 3年目、より多くを得るために、Conferenceに参加
- Redux
- React Redux
自分自身について。
- 十分なキャリアがあるか?
- 英語の解釈問題
- 書くことの難しさ
Richard Feynman
Names don't constitude knowlege
tool や library は開発者を助けてくれる
いつ、どこで学ぶか?
誰かに教えることは、学ぶための最も良い方法
- Docsを書くことはこのことに繋がる
- どう書けば相手(ユーザー)に伝わるか、を考えなければならないから
tackling the challenge
- 英語で書くこと。
- 細かい Typo やミスなど気にしない
- 完璧じゃなくても良い
- Tipsの共有による練習
- thesaurusのようなツールを使う
- proof reading
- 他の人に説明する
- 1-1 sharing
- 習慣にすること
- メンテナと直接やり取りできる素晴らしさ
- ライブラリのアーリーアダプターになる
- チームにおけるドメインエキスパートになること
Docs
2. Serverless is your BFF
start
- かんたんなアバターを作るサービス モバイル、PCそれぞれからBFFに接続-> 各Serviceに
Webの歴史
- 1.0はとてもシンプル
- 2.0はたくさんのサービス・機能が生まれた。
- Front end/backend に別れた
- Frontendはツールやフレームワークの登場によりかんたんに。
- Fullstack
Full stack?
- UI -> Product
- 仕様ぎめ、開発、Ops
- Node.jsによりFrontend、Backendで再利用できるコードも増えた
- ただしFrontend、Backendのやり取りは依然困難。
- Backend はとても複雑
- Scalable, Security, Debuggable...
- Prototype -> Production architectureに移るに当たり、気にするものがいっぺんに増える
- Autoscale
Cloud computing
すべて自前のマシンで用意するOn-premissから、FunctionsのみのFaaSへ。
- ビジネスにフォーカスする
Node.js
- Faas
- SCF
- Faas
tencent cloud でどのようにアップロードしているかデモ
- アップロードした写真に帽子をつける
- Ergonomic Upload code and go
Serverless is economic
- reduce team size
- 使っただけ払う
VMだと必要なときもそうでないときも同額かかる
Serverless is reliable
- No ops
summary
- Serverless の紹介。Webの歴史、良いところを取り上げ、Tencent cloudを使うデモも。
- Live coding, Live debugging
3. Entropic package registry
What is package manager?
- Registory <--> client
- Do install work?
- publish permission
What is package?
- Softwareをひとまとめにしたもの
- NPMなどであつかう
- Npm registry -> npm -> disk
- disk -> webpack -> bunndle ひとまとめに
Node.js
- Node.jsも一つの file manager
- disk -> Node.js -> commonjs
- 動的に package manager を動かす?
yarn
- cache -> yarn -> Pnt resolution
Plugin
- loader of Node.js
Tink
- Disk にキャッシュする
Recap
基本的に
- 全部 Package managerを使う。
Entropic
- Entropic は Package を一箇所にまとめるのではなく、個別に分かれている
- それらが連携しあって動く。
4. Redux Based Modular Design
Slide
Motivation
- build large app
- Modular -> 模块化
- サイズが大きくなってくると、
- Combine reducers,Middleware, connection
- 機能ごとにクラス分け
modularity
困難
- CoreのBuisiness logicのUIからの分離
- 状態管理
- カプセル化
Pros
- CDのしやすさ Divide, conquer
- テストの完全自動化
Motivation & Goal
Redux Cons
- Immutable data
- 実現が難しい?
- verbose update operations
- Boilerplate Code が増える
- Modularity
- Loose, difficult
- ロジックが分割しづらい(UIに入り込んでるとか)
Solution
usm-redux
- Reducer
- @state decorateを使って状態管理、
- @action で処理を定義。関数につく。
- 状態を変える
- Router 的な動きが実現できるので、switchなどを取り除ける
- 引数にstateを追加
Action type
dispatch
- イベント処理の分割
Module Dependency
- Module inject
- Customizable Iocのようなものをつかう
Immutable data update
immer
- 今の値をベースにImmutable stateを作る
benefit
5. Diving into TypeScript design metadata with NestJS
Slide
memo
- KoaもExpressやNest.JSと同じフレームワークらしい
Design-time metadata
- Reflection
Parameter type metadata
- extract type
- DI, Type -> Nest.js feature
DIの説明
- @Injectable() をつけることで、複数のDependencyを解決できる
Compiler metadata
decorate( [metadata('design:parametypes', [HttpService, Logger])], CatsService,
Reflection API
Reflect.getMetadata('design:parametypes',CatsService)
Pipes
- castなども使われる
PipeTransform{ transform(
) }
Reflection API challenges
interfaces
- 依存interfaceの場合、JSにしたときはObjectとなる
Potential solution
- abstruct solution
Generics
- Genericsの場合にどう解決する?
- JSにするとクラス情報はなくなってしまう
*
Circular dependency
- JSにするとクラス情報はなくなってしまう
*
- 依存クラスがJS変換時にundefinedに
- @Inject( =>
Type metadata
export class User{ email: string; name: string; } ↓ export class User{ @Property email: string; @Property name: string; }
複数プロパティがあるとき Reflect.getMetadata('design: type, new User(), 'email')だと正しくmetadata がundefined になってしまい、Typeがとれない
@Propertyを使う
What's the point
AST
TypeScript Plugins
Return type metadata
- OpenAPI gRPC, GraphQL mutations
戻り地がPromise< string>のとき、Reflect.getMetadata が Promiseになる。stringは?
Recap
design-time metada
TODO: news letter 登録
6. Writing code to refactor code
Slide
概要
- 今年のはじめに実施した大規模なリファクタリングの話
- AST(Abstruct Syntax Trees)
はじめに
- Zenhubでは CommonJS-> ES6に変更した。
- 1752files
- 5 years old
Large scale refactoring のながれ(失敗)
- Find and Replace
- どうにもならん\(^o^)/
ASTの紹介
codemod
find & replace inspect the code
- Prettier
- ESLint autofix
webpack, babel transpilationはcodemodではない
- Codemod in action
- Transforming requires to import
- CommonJSの var a = require("doge.js").wow => import { wow as amused } from "doge.js"
- iTerm2
- npx codemod としてるから、npm でインストールするツールか?
from が同じものがある場合、combine?
ASTはリファクタリングのときにも使える
- Codemodだけでなく、StaticTypesなどいろんなツールがある
7. JavaScript 的执行 & 性能
Slide
はじめに
- a.b = 123 と a[' b'].b のパフォーマンス差?
- esparse
- V8と? の比較
- d8でどう解釈されているか
- BinaryExpression
bytecode
- staGlobal
- jerry --show-opcodes add.js
- V8での解釈・実行の流れや発生したパフォーマンス問題など
WebAssembly
JavaScript の歴史
- Mocha、LiveScript,
- JavaApplet, ActionScript, SilverLight
V8
- V8によって、JavaScriptがWebフロントエンドでの立場を不動のものにした?
8. 去除迷雾, 漫谈 WebAssembly
- C/C++, Go などの複数のから WAコードを生成
- ブラウザ上では実行できない?
WAはJavaScriptにとって代わるか?
- 補うもの
- JSで直接WebAssemblyを書くことはできない
実行速度はあまり変わらない?
- V8の場合、JS -> AST -> ignition -> turofan -> local machine code
- WA(.wasm) -> Liftoff -> TurboFan -> local machine code
パフォーマンスは変わらない?
- WAはDownload, Decodeを同時にするのでパフォーマンスが上がる
- 最適化
WA moduleの構成
- function signature
- run time
おすすめの言語
- Rust
- WA を推し進めているMozillaが作っている言語
Demo
- 書くときは普通にRustをかく。実行時はバイナリコードに。
- バイナリコードに変換する?ツールあり。
Panel discussion
翻訳するときに、ネイティブのような表現ができない
問題のあるパッケージが混ざった場合にどう対応するか
- npmなどと同じ?
Nest.jsでInversifyJSを使わない理由?
- InversifyJS自体は使っていないから実際のところはわからないが、 使い方が違う?
- 少なくともInversifyJSなど他のものを使うことは進めない
ASTによるリファクタリングが向いてないとき?
CommonJS -> ES6には使えるが、JS -> TSではASTによるリファクタリングが有効か?
- おそらく
Jerry.js
WAのセキュリティ上の問題など?将来的な問題が発生する恐れはある?
- すでに対応はしている
ドキュメントが人に伝わらないとき?
- 言い方を変えてみる、細かく説明してみる
- 時間をあけてもう一度自分で読んでみる。
- 理解できる?
Middleware of NestJS?
- Expressのものと同じ?
- HTTPアプリケーションを作るときには依存する
Nest.js は GraphQL に対応している?
- Yes.
- GraphQL のデータの作り方は2種類あり、Code firstとData first?がある
WAはマルチスレッドなどの対応している?
- している?が使ったことはない
- 基本的にもとの言語に依存する
- ブラウザの機能を使う?
CherryScript Quick.js?
Entrophic Production ready?
- No
- いつ? -> まだわからなそう