Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 2
npm install donejs -g
donejs init donejs-chat
Then go into the application folder
cd donejs-chat
donejs develop
npm install bootstrap --save
Change index.stache to:
<html><head><title>{{title}}</title>
{{asset "css"}}
</head><body><can-importfrom="bootstrap/less/bootstrap.less!" /><can-importfrom="donejs-chat/styles.less!" /><can-importfrom="donejs-chat/app" as="viewModel" />
{{asset "inline-cache"}}
{{#switch @env.NODE_ENV}}
{{#case "production"}}
<scriptsrc="http://donejs-chat.divshot.io/node_modules/steal/steal.production.js" main="donejs-chat/index.stache!done-autorender"></script>
{{/case}}
{{#default}}
<scriptsrc="/node_modules/steal/steal.js"></script>
{{/default}}
{{/switch}}
</body></html><divclass="container"><divclass="row"><divclass="col-sm-8 col-sm-offset-2"><h1>Hello world</h1></div></div></div>Make some changes and see stuff updates. Talk about how live-reload even works on the server!!!
donejs generate component home.component chat-home
donejs generate component messages chat-messages
- Add link to
chat-home
<can-componenttag="chat-home"><styletype="less">display: block;
h1.page-header { margin-top:0; }
</style><template><can-importfrom="can/view/href/" /><h1class="page-header text-center"><imgsrc="http://donejs.com/static/img/donejs-logo-white.svg" alt="DoneJS logo" /><br>Chat
</h1><acan-href="{ page='chat' }" class="btn btn-primary btn-block btn-lg">Start chat</a></template></can-component>- Add link on chat page (
messages/messages.stache)
<can-importfrom="can/view/href/" /><h5><acan-href="{ page='home' }">Home</a></h5><p>{{message}}</p>- Add route in
app.js
route('/:page',{page: 'home'});- Load dynamically in
index.stache
<divclass="container"><divclass="row"><divclass="col-sm-8 col-sm-offset-2">
{{#eq page 'chat'}}
<can-importfrom="donejs-chat/messages/">
{{#if isPending}}
Loading...
{{else}}
<chat-messages/>
{{/if}}
</can-import>
{{else}}
<can-importfrom="donejs-chat/home.component!">
{{#if isPending}}
Loading...
{{else}}
<chat-home/>
{{/if}}
</can-import>
{{/eq}}
</div></div></div>donejs generate supermodel message
Set URL to http://donejs-chat.herokuapp.com/api/messages.
In src/messages/messages.stache:
<message-modelget-list="{}"><h5><acan-href="{ page='home' }">Home</a></h5><divclass="list-group">
{{#each ./value}}
<aclass="list-group-item"><h4class="list-group-item-heading">{{name}}</h4><pclass="list-group-item-text">{{message}}</p></a>
{{/each}}
{{^if ./value.length}}
<aclass="list-group-item"><h4class="list-group-item-heading">No messages</h4></a>
{{/if}}
</div></message-model>alternate:
<can-importfrom="donejs-chat/models/message" /><h5><acan-href="{ page='home' }">Home</a></h5><message-modelget-list="{}" class="list-group">
{{#each ./value}}
<aclass="list-group-item"><h4class="list-group-item-heading">{{name}}</h4><pclass="list-group-item-text">{{message}}</p></a>
{{else}}
<aclass="list-group-item"><h4class="list-group-item-heading">No messages</h4></a>
{{/each}}
</message-model>- add html, and (enter) event handler
<divclass="row"><divclass="col-sm-3"><inputtype="text" class="form-control" id="name" placeholder="Your name" can-value="{name}"></div><divclass="col-sm-9"><inputtype="text" class="form-control" id="message" placeholder="Your message" can-value="{message}" (enter)="{send}"></div></div>- import Message model in messages.js
<can-importfrom="donejs-chat/models/message" />- Add send method in
src/messages/messages.js
importComponentfrom'can/component/';importMapfrom'can/map/';import'can/map/define/';import'./messages.less!';importtemplatefrom'./messages.stache!';importMessagefrom'../models/message';exportconstViewModel=Map.extend({send(){newMessage({name: this.attr('name'),message: this.attr('message')}).save().then(msg=>this.attr('message',''));}});exportdefaultComponent.extend({tag: 'chat-messages',viewModel: ViewModel,
template
});- Talk about set logic
> npm install steal-socket.io --save
Add to src/models/message.js
importiofrom'steal-socket.io';constsocket=io('http://donejs-chat.herokuapp.com');socket.on('messages created',order=>messageConnection.createInstance(order));socket.on('messages updated',order=>messageConnection.updateInstance(order));socket.on('messages removed',order=>messageConnection.destroyInstance(order));npm install bit-tabs --save
Import:
<can-importfrom="bit-tabs/unstyled" />Add to page:
<bit-tabstabs-class="nav nav-tabs"><bit-paneltitle="CanJS">
CanJS provides the MV*
</bit-panel><bit-paneltitle="StealJS">
StealJS provides the infrastructure.
</bit-panel></bit-tabs>Add some styles:
bit-panel {
display: block;
padding:10px;
}- Server Side Rendering
- Fall through caching
- Inline caching
- Request combining
node build
Close the old server and run
NODE_ENV=production donejs start
- Create Divshot application, install the CLI tool and log in
> npm install -g divshot-cli
> divshot login
- Paste config in
"donejs": {"deploy": {"root": "dist","services": {"production": {"type": "divshot","config": {"name": "donejs-chat","headers": {"/**": {"Access-Control-Allow-Origin": "*"}}}}}}},
...
"system": {
...
"envs": {"server-production": {"baseURL": "https://donejs-chat.divshot.io/"}}}- Run
node buildagain. - Run
donejs deploy - Add http://donejs-chat.divshot.io to <script src and to envs.server-production.baseURL
- Show off
First create an app.html file that looks like:
<html><head><title>DoneJS chat</title></head><body><scriptload-bundlesenv="cordova-production" src="node_modules/steal/steal.production.js" main="donejs-chat/index.stache!done-autorender"></script></body></html>Make sure all platform SDKs like XCode (for iOS) and the Android SDK are installed.
Update build.js to:
varstealTools=require("steal-tools");varbuildPromise=stealTools.build({config: __dirname+"/package.json!npm"},{bundleAssets: true});varcordovaOptions={buildDir: "./build/cordova",id: "com.donejs.chat",name: "DoneJS chat",platforms: ["ios"],plugins: ["cordova-plugin-transport-security"],index: __dirname+"/app.html",glob: ["node_modules/steal/steal.production.js"]};varstealCordova=require("steal-cordova")(cordovaOptions);// Check if the cordova option is passed.varbuildCordova=process.argv.indexOf("cordova")>0;if(buildCordova){buildPromise.then(stealCordova.build).then(stealCordova.ios.emulate);}Then run
npm install ios-sim -g
node build cordova
Update your package.json:
"main": "app.html",
...
"window": {"width": 1060,"height": 625,"toolbar": false}Add to build.js:
varnwOptions={buildDir: "./build",platforms: ["osx"],files: ["package.json","app.html","node_modules/steal/steal.production.js"],version: "0.12.3"};varstealNw=require("steal-nw");// Check if the cordova option is passed.varbuildNW=process.argv.indexOf("nw")>0;if(buildNW){buildPromise=buildPromise.then(function(buildResult){stealNw(nwOptions,buildResult);});}Add to app.js
import platform from "steal-platform"
if(platform.isCordova || platform.isNW) {
route.defaultBinding = "hashchange";
}
Then run
node build nw
cd build/donejs-chat/osx64
open donejs-chat.app