SlideShare une entreprise Scribd logo
1  sur  24
SalesforceでのモダンSPA開発
(Mashmatrix “Sheet" の場合)
業務アプリケーションとSPA
• SPA = Single Page Application
• サーバサイドレンダリングしないWebアプリ
• 画面描画のためにサーバを経由しない ⇒ ユーザ入力に対して迅速に反応
• もともと業務系アプリはSPAに向いている!
• 例えばSEOはサーバサイドレンダリングでしかできないが、ほとんどの場合要件に
含まれない
• しかしフロントエンドアプリ作成は面倒だった
• 標準ルールの不在/職人の世界
• 大規模開発では破綻するケースも
時代は変わる
• JavaScriptでアプリケーションを書くための環境が整った
• モジュールロードの仕組みの標準化(CommonJS)、ビルド文
化の定着(Grunt/Gulp)、パッケージマネージャの普及(npm
)
• 職人技・ハックの世界 ⇒ 統制の取れた通常のWebアプリケ
ーション開発が可能に
Salesforceへの影響
• VisualforceはよりJavaScriptフレンドリーに
• apex:actionFunction ⇒ rerender (JSを隠蔽しようとしていた時
代)
• JavaScript Remoting (JSの力を無視できなくなった時代)
• Remote Object (もはやApexすら…?)
Lightning !
Lightningに至る道(過去形)
• これからの業務アプリ構築はHTML5 / JavaScriptベースが基本になるだろう(⇐ たぶんそ
の通り)
• なのでSalesforceも今後はHTML5/JavaScriptでアプリを簡単に作れるようにせないかんぜ
(⇐ 仰るとおり)
• ということで弊社謹製のLightning Framework作ったよ(⇐ へえ。がんばったのかな?ど
れどれ?)
• 現在に至る()
なぜそうなった
• フロントエンド周りの進化が早すぎた
• 開発開始後、まわりの世界を取り入れようとしなかった
• 「僕らはエンタープライズだから…」症候群
• 自身を存続させるためだけにやってる状態
Salesforce Lightning Design System
(SLDS)
SLDSの要点
• HTML/CSSのみ
• JavaScriptなし (例外: SVG4Everybody)
• 参考: Bootstrap => jQuery に依存
SLDSでの動的振る舞いの実現方法
• Dropdown menu (:hover CSS擬似クラス)
• Stateful Button
• それ以外 ⇒ 全部 JavaScript コード書いてやってね !
SLDSでのHTMLマークアップ
React.js
Pack into Component
react-lightning-design-system
http://stomita.github.io/react-lightning-design-system/
https://github.com/stomita/react-lightning-design-system/
ここまでのまとめ
• JavaScriptで業務アプリ作るの結構普通になってきたね。Salesforceでも
おなじだね。
• Visualforce上でスクラッチでデザインする人のためにSLDSというCSSデ
ザインフレームワークが出てきたけど、まだそのままだと使いづらいね
• React.JSで振る舞いも含めてコンポーネントにしてあげると使いやすい
。なので react-lightning-design-system を作ったよ。
Case Study : Mashmatrix Sheet
Architecture of Mashmatrix Sheet
Action
CreatorStore
View
State
callrender
Reselect
Action
Redux
Action(async)
• Lightning: @AuraEnabled + enqueueAction
• Visualforce: @RemoteAction + VFRemoting
• Local: API + JSForce
Demo
Salesforceとの接続
• 環境ごとにService呼び出しのためのService Providerを作成
• Local用(JSforce呼び出し)/ Visualforce用(Remoting呼び出し
)/Lightning用(AuraEnabledメソッド呼び出し)
• LightningではComponentのリファレンスを初期化時に渡す必要あり
• Fluxからの非同期呼び出しでは接続環境は意識しない
Remoting Interface
/**
*
*/
public with sharing class MsmxSheetController {
@RemoteAction
@AuraEnabled
public static List<SObject> query(String queryJSON) {
// ..
}
// ..
}
Initialization (Visualforce)
<apex:page docType="html-5.0"
sidebar="false"
cache="true"
controller="MsmxSheetController"
>
<link rel="stylesheet" href="{!URLFOR($Resource.MsmxSheetVendor, 'salesforce-
lightning-design-system/assets/styles/salesforce-lightning-design-system-vf.css')}" />
<link rel="stylesheet" href="{!URLFOR($Resource.MsmxSheetApp, 'styles/main.css')}" />
<script src="{!URLFOR($Resource.MsmxSheetVendor,
'jsforce/build/jsforce.min.js')}"></script>
<script src="{!URLFOR($Resource.MsmxSheetApp, 'scripts/main.js')}"></script>
<div class="msmx-tabbed-container msmx-app slds"></div>
<script>
(function() {
// ...
MsmxSheet.render('vf', document.querySelector(‘msmx-tabbed-container’), options);
})();
</script>
</apex:page>
Initialization (Lightning)
({
afterRender: function(cmp, evt) {
this.superAfterRender();
var options = {
component: cmp,
appResourceRoot: '/resource/MsmxSheetApp/',
vendorResourceRoot: '/resource/MsmxSheetVendor/',
};
typeof MsmxSheet !== 'undefined' && MsmxSheet.renderComponent('aura',
cmp.getElement(), options);
},
rerender: function(cmp, evt) {
// ...
}
})
MsmxSheetRenderer.js
API Failover
• APIコール数の消費を減らすため、VF上ではRemotingを優先的に
利用
• Apex内からアクセスできない情報はAPI Call経由
• JSforceはSOAP APIも一部サポート(AJAX toolkitの代替に)
• APIコール不可の場合は別の手段を用いる(Failover in Application
Design)
Thanks.

Contenu connexe

Tendances

Closure Toolsの紹介
Closure Toolsの紹介Closure Toolsの紹介
Closure Toolsの紹介
Yusuke Amano
 

Tendances (8)

日本のCMSの今。特徴とプロジェクトから考える、次のCMS選び:本編
日本のCMSの今。特徴とプロジェクトから考える、次のCMS選び:本編日本のCMSの今。特徴とプロジェクトから考える、次のCMS選び:本編
日本のCMSの今。特徴とプロジェクトから考える、次のCMS選び:本編
 
Data API ことはじめ
Data API ことはじめData API ことはじめ
Data API ことはじめ
 
まだ DOM 操作で消耗してるの?
まだ DOM 操作で消耗してるの?まだ DOM 操作で消耗してるの?
まだ DOM 操作で消耗してるの?
 
一度使うとレンタルサーバーに戻れない!?便利機能を使ってみよう!Web制作でのMicrosoft Azure 活用方法
一度使うとレンタルサーバーに戻れない!?便利機能を使ってみよう!Web制作でのMicrosoft Azure活用方法一度使うとレンタルサーバーに戻れない!?便利機能を使ってみよう!Web制作でのMicrosoft Azure活用方法
一度使うとレンタルサーバーに戻れない!?便利機能を使ってみよう!Web制作でのMicrosoft Azure 活用方法
 
SIROK技術勉強会 #1 「Reactってなんだ?」
SIROK技術勉強会 #1 「Reactってなんだ?」SIROK技術勉強会 #1 「Reactってなんだ?」
SIROK技術勉強会 #1 「Reactってなんだ?」
 
Closure Toolsの紹介
Closure Toolsの紹介Closure Toolsの紹介
Closure Toolsの紹介
 
JAWSUG初心者支部 AWSの勉強の仕方
JAWSUG初心者支部 AWSの勉強の仕方JAWSUG初心者支部 AWSの勉強の仕方
JAWSUG初心者支部 AWSの勉強の仕方
 
データベース不要のCMS Picoについて
データベース不要のCMS Picoについてデータベース不要のCMS Picoについて
データベース不要のCMS Picoについて
 

Similaire à SalesforceでのモダンSPA開発(Mashmatrix ”Sheet"の場合)

JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)
VOYAGE GROUP
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
Yuki KAN
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
Oonishi Takaaki
 
Cake php×国産!オープンソースcms「basercms」が熱い!
Cake php×国産!オープンソースcms「basercms」が熱い!Cake php×国産!オープンソースcms「basercms」が熱い!
Cake php×国産!オープンソースcms「basercms」が熱い!
Ryuji Egashira
 

Similaire à SalesforceでのモダンSPA開発(Mashmatrix ”Sheet"の場合) (20)

JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)
 
なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?
 
第24回WebSig会議「100人で考える、理想的なサイトマップの形と標準書式」WebSiteExpert記事
第24回WebSig会議「100人で考える、理想的なサイトマップの形と標準書式」WebSiteExpert記事第24回WebSig会議「100人で考える、理想的なサイトマップの形と標準書式」WebSiteExpert記事
第24回WebSig会議「100人で考える、理想的なサイトマップの形と標準書式」WebSiteExpert記事
 
Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)
Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)
Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)
 
Applications made ​​with twelve factor-app
Applications made ​​with twelve factor-appApplications made ​​with twelve factor-app
Applications made ​​with twelve factor-app
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
 
軽量フレームワークNancy
軽量フレームワークNancy軽量フレームワークNancy
軽量フレームワークNancy
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
Cake php×国産!オープンソースcms「basercms」が熱い!
Cake php×国産!オープンソースcms「basercms」が熱い!Cake php×国産!オープンソースcms「basercms」が熱い!
Cake php×国産!オープンソースcms「basercms」が熱い!
 
Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
 
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
 
Going Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersGoing Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No Servers
 
Hadoop Source Code Reading #17
Hadoop Source Code Reading #17Hadoop Source Code Reading #17
Hadoop Source Code Reading #17
 
最近のASP.NET事情2013Winter
最近のASP.NET事情2013Winter最近のASP.NET事情2013Winter
最近のASP.NET事情2013Winter
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
 
ASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップ
 
PHPerだってサーバーレスしたい!
PHPerだってサーバーレスしたい!PHPerだってサーバーレスしたい!
PHPerだってサーバーレスしたい!
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
Kafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャ
Kafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャKafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャ
Kafka Streamsによるスケーラブルで非環境依存なストリーム/バッチ処理アーキテクチャ
 

Plus de Shinichi Tomita

アイデンティティ2.0とOAuth/OpenID Connect
アイデンティティ2.0とOAuth/OpenID Connectアイデンティティ2.0とOAuth/OpenID Connect
アイデンティティ2.0とOAuth/OpenID Connect
Shinichi Tomita
 
モバイルBaaSの概観と最新動向(2014版)
モバイルBaaSの概観と最新動向(2014版)モバイルBaaSの概観と最新動向(2014版)
モバイルBaaSの概観と最新動向(2014版)
Shinichi Tomita
 
シングルサインオンの歴史とSAMLへの道のり
シングルサインオンの歴史とSAMLへの道のりシングルサインオンの歴史とSAMLへの道のり
シングルサインオンの歴史とSAMLへの道のり
Shinichi Tomita
 
モバイルBaaSの概観と最新動向 (2013/6/7)
モバイルBaaSの概観と最新動向 (2013/6/7)モバイルBaaSの概観と最新動向 (2013/6/7)
モバイルBaaSの概観と最新動向 (2013/6/7)
Shinichi Tomita
 
(M)BaaS and Enterprise Mobile Applications
(M)BaaS and Enterprise Mobile Applications(M)BaaS and Enterprise Mobile Applications
(M)BaaS and Enterprise Mobile Applications
Shinichi Tomita
 
クラウド・スマートデバイス事例調査報告
クラウド・スマートデバイス事例調査報告クラウド・スマートデバイス事例調査報告
クラウド・スマートデバイス事例調査報告
Shinichi Tomita
 
Cloud-to-Intranet messaging by Force.com Streaming API
Cloud-to-Intranet messaging by Force.com Streaming APICloud-to-Intranet messaging by Force.com Streaming API
Cloud-to-Intranet messaging by Force.com Streaming API
Shinichi Tomita
 
Sales Force Episode VI ~ Return of Ajax Toolkit ~
Sales Force Episode VI ~ Return of Ajax Toolkit ~Sales Force Episode VI ~ Return of Ajax Toolkit ~
Sales Force Episode VI ~ Return of Ajax Toolkit ~
Shinichi Tomita
 
Herokuで動かす スクリーンショットサーバ
Herokuで動かす スクリーンショットサーバHerokuで動かす スクリーンショットサーバ
Herokuで動かす スクリーンショットサーバ
Shinichi Tomita
 
Force.com とか @ PaaS祭り
Force.com とか @ PaaS祭りForce.com とか @ PaaS祭り
Force.com とか @ PaaS祭り
Shinichi Tomita
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携
Shinichi Tomita
 
Phantomjs Screenshot Server on Heroku
Phantomjs Screenshot Server on HerokuPhantomjs Screenshot Server on Heroku
Phantomjs Screenshot Server on Heroku
Shinichi Tomita
 
Collecting Photo Stream in Node.js on Heroku
Collecting Photo Stream in Node.js on HerokuCollecting Photo Stream in Node.js on Heroku
Collecting Photo Stream in Node.js on Heroku
Shinichi Tomita
 

Plus de Shinichi Tomita (20)

SalesforceからAWSへの接続 using OIDC/SAML
SalesforceからAWSへの接続 using OIDC/SAMLSalesforceからAWSへの接続 using OIDC/SAML
SalesforceからAWSへの接続 using OIDC/SAML
 
Developing SLDS Apps with React.js
Developing SLDS Apps with React.jsDeveloping SLDS Apps with React.js
Developing SLDS Apps with React.js
 
Spring'15 Update - Named Credential & Long Running Callout
Spring'15 Update - Named Credential & Long Running CalloutSpring'15 Update - Named Credential & Long Running Callout
Spring'15 Update - Named Credential & Long Running Callout
 
Summer'14 Update - What's new in Force.com Canvas -
Summer'14 Update - What's new in Force.com Canvas -Summer'14 Update - What's new in Force.com Canvas -
Summer'14 Update - What's new in Force.com Canvas -
 
アイデンティティ2.0とOAuth/OpenID Connect
アイデンティティ2.0とOAuth/OpenID Connectアイデンティティ2.0とOAuth/OpenID Connect
アイデンティティ2.0とOAuth/OpenID Connect
 
モバイルBaaSの概観と最新動向(2014版)
モバイルBaaSの概観と最新動向(2014版)モバイルBaaSの概観と最新動向(2014版)
モバイルBaaSの概観と最新動向(2014版)
 
シングルサインオンの歴史とSAMLへの道のり
シングルサインオンの歴史とSAMLへの道のりシングルサインオンの歴史とSAMLへの道のり
シングルサインオンの歴史とSAMLへの道のり
 
Salesforce1最速経路
Salesforce1最速経路Salesforce1最速経路
Salesforce1最速経路
 
モバイルBaaSの概観と最新動向 (2013/6/7)
モバイルBaaSの概観と最新動向 (2013/6/7)モバイルBaaSの概観と最新動向 (2013/6/7)
モバイルBaaSの概観と最新動向 (2013/6/7)
 
(M)BaaS and Enterprise Mobile Applications
(M)BaaS and Enterprise Mobile Applications(M)BaaS and Enterprise Mobile Applications
(M)BaaS and Enterprise Mobile Applications
 
モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用
モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用
モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用
 
クラウド・スマートデバイス事例調査報告
クラウド・スマートデバイス事例調査報告クラウド・スマートデバイス事例調査報告
クラウド・スマートデバイス事例調査報告
 
Cloud-to-Intranet messaging by Force.com Streaming API
Cloud-to-Intranet messaging by Force.com Streaming APICloud-to-Intranet messaging by Force.com Streaming API
Cloud-to-Intranet messaging by Force.com Streaming API
 
Sales Force Episode VI ~ Return of Ajax Toolkit ~
Sales Force Episode VI ~ Return of Ajax Toolkit ~Sales Force Episode VI ~ Return of Ajax Toolkit ~
Sales Force Episode VI ~ Return of Ajax Toolkit ~
 
Intro to JFDG
Intro to JFDGIntro to JFDG
Intro to JFDG
 
Herokuで動かす スクリーンショットサーバ
Herokuで動かす スクリーンショットサーバHerokuで動かす スクリーンショットサーバ
Herokuで動かす スクリーンショットサーバ
 
Force.com とか @ PaaS祭り
Force.com とか @ PaaS祭りForce.com とか @ PaaS祭り
Force.com とか @ PaaS祭り
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携
 
Phantomjs Screenshot Server on Heroku
Phantomjs Screenshot Server on HerokuPhantomjs Screenshot Server on Heroku
Phantomjs Screenshot Server on Heroku
 
Collecting Photo Stream in Node.js on Heroku
Collecting Photo Stream in Node.js on HerokuCollecting Photo Stream in Node.js on Heroku
Collecting Photo Stream in Node.js on Heroku
 

SalesforceでのモダンSPA開発(Mashmatrix ”Sheet"の場合)