SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
給 iOS ⼯工程師的
Vue.js 開發
zonble
最近我在做網站
• 因為我的 iOS App ⼀一直被蘋果退件,總點做點別的

• iOS ⼯工程師最好還是學⼀一些 Web 開發技能

• iOS 不不會被 Android 取代,但是 Native App 很有可能被
Web App 取代

• 做了了 Web 版本,包在 Electron 裡頭,等於做好了了所有的
Desktop 版本
連上去就直接聽 KKBOX 歌單
https://www.kube-app.com
成果
成果
SPA?
起初 Web 是很單純的
• 瀏覽器器就是個「可以透過網路路抓取、閱讀某種可以互相連
結的⽂文件」的軟體

• 瀏覽器器對 Web Server 發送 HTTP 連線,取得 HTML ⽂文件

• 瀏覽器器將 HTML ⽂文件直譯成 DOM

• 瀏覽器器將 DOM 渲染成在螢幕上顯示的結果
Server Side 動態網⾴頁
• WWW Server 接受外部傳⼊入的參參數數,根據參參數數,回傳不不同
的 HTML ⽂文件

• 可以⽤用 GET、POST…等⽅方式傳⼊入參參數數

• ASP、PHP…還有⽬目前各種 Web Servre
Framework(Rails、Laravel、Django)都在做這種事情
但是偏偏有⼈人想在⽂文件格式裡頭搞
應⽤用程式開發
• 最早的作法是,在 HTML 裡頭挖⼀一塊可以塞⼊入執⾏行行 Native
Code 的 drawing context,讓瀏覽器器 Plug-in 渲染內容

• Java Applet、ActiveX、QuickTime…最後 Flash 稱霸了了將
近⼗十年年的時間

• 但是在 2007 年年,有⼀一⽀支⼿手機問世,徹底打倒了了 Flash
動態改變 DOM
• DOM 的內容除了了可以從 HTML 當中產⽣生外,也可以由
JavaScript 動態修改(getElementById、addChild…)

• JavaScript ⾃自⼰己也可以發送網路路連線(AJAX),然後⽤用抓
到的資料料改變⾴頁⾯面中部分的資料料

• 最後 DOM 都可能不不是從 HTML 產⽣生,⽽而都是⽤用
JavaScript 產⽣生的,只⽤用 JS 與 DOM 產⽣生的應⽤用,稱為
Single Page Application(SPA)
這年年頭的 SPA
• 你可能不不是直接去寫直接讓瀏覽器器閱讀的 HTML 與 JS

• ⽽而是先寫某個其他格式的東⻄西,然後由特殊⼯工具打包成最
後發⾏行行的版本

• 瀏覽器器不不認得 ES6、TypeScript…所以⽤用 Babel 翻譯成瀏覽
器器認得的 JS

• 然後把分散的 JS、Asset…透過 Web Pack 打包成⼀一⼤大包
JS
對 iOS ⼯工程師來來說
• ES6、TypeScript -> JS 可以想成

• Objective-C -> C -> LLVM Bitcode -> Machine Code

• 打包 Asset

• xib -> nib、storyboard -> storyboardc、xcassets-
>Assets.car
VUE.js
我是從這裡開始的
https://github.com/
SimulatedGREG/electron-vue
Vue.js 的檔案組成
• ⼀一個 Vue.js 專案,是由很多個 .vue 檔案組成的

• 每個 .vue 檔案可以想像成類類似 UIKit 的 View Controller 的
東⻄西,每個 .vue 檔案掌控⼀一部分的 DOM 元件與邏輯
⼀一個 .vue 檔案
// 這部份像是 .xib 檔案
<template>

</template>
<style>

</style>
// 這部份像是你的 View Controller
<script>

</script>
<script>
export default {
name: 'my-view',
data () { // private properties
return {
'data_key': 'data_value'
}
}
props: ['prop_key'], // public properties
watch: { // KVO
data_key: () => {
}
},
created: () => { // init
}.
methods () { // private methods
login() {
}
},
computed: { // 晚點說
}
}
</script>
<template>
<div>
<p> {{ data_key }} </p>
<button @click=“login”>Action</button>
</div>
</template>
// 另外⼀一個檔案想要使⽤用 my-view
<template>
<my-view></my-view>
</template>
<script>
import MyView from ‘MyView.vue’
export default {
components: {MyView}

}
</script>
// 另外⼀一個檔案想要使⽤用 my-view
// 綁定 prop
<template>
<my-view v-bind:prop_key=“prop_value”></my-
view>
</template>
// iOS 的 view state pattern?
// 可以使⽤用 v-if 搭配 data
<template>
<loading v-if=“state==‘loading’”><loading>
<error v-if=“state==‘error’”><error>
<div v-if=“state==‘completed’”></div>
</template>
<script>
import Loading from ‘Loading.vue’
import Error from ‘Error.vue’
export default {
components: {Loading, Error},
data: {
return {
state: ‘completed’
}

}

}
</script>
// 呼叫 API
<script>
export default {
…
methods {
callAPI() { axios.get(‘https://..’).then(

data => { // 要⽤用 nextTick

this.$nextTick(
() => { this.state = ‘completed’ }
)})

}

}

}
</script>
// Collection View 與 Table View?
// 可以使⽤用 v-for
<template>
<div v-for=“item in items”>
</div>
</template>
<script>
export default {
data: {
return {
items: []
}

}

}
</script>
跨 Vue 檔案之間的溝通?
• 要⽤用 Vuex

• Vuex 是⼀一個超⼤大的共⽤用物件,每個 .vue 檔案,可以⽤用
this.$store 拿到這個物件

• 所有 .vue 檔案都透過 this.
$store.dispatch(‘function_name’) 改變 vuex 的狀狀態

• vuex 被修改之後,⽤用到某個共⽤用狀狀態的 .vue,會透過
computed 收到修改
⽤用⼒力力給他跑下去
• npm install

• npm run dev

• npm run build // 編譯 electron 版本

• npm run build:web // 編譯網⾴頁版
⼀一些對應
• UITableView -> HTML Table

• UICollectionView -> CSS Grid

• UINavigationController、UITabBarController -> Route
View

• NSURLSession -> XHR(XMLHttpRequests)、Axois…

• NSUserDefaults -> Local Storage
iOS ⼯工程師的進⼊入障礙
JavaScript 的⾏行行為

跟你想的完全不不⼀一樣
• JS 的 for..in 不不是給 Array ⽤用的,⽽而是對所有物件都可以
⽤用,是列列舉某個物件的所有 property…

• JS 的 let 是產⽣生 block scope 的變數數,var 是產⽣生 function
scope 的變數數…
CORS
• Cross-Origin Resource Sharing

• 簡單講,寫 app 可以直接打 API,但是網⾴頁上⾯面預設不不允
許抓取跟你不不在同⼀一個網域的 API 的資料料

• 除⾮非對⽅方 API server 帶了了像「Access-Control-Allow-
Origin: *」的 HTTP Header,即使有,遇到了了 302
redirect,也⼀一樣抓不不到

• 所以就算你寫⼀一個 JS App,但是 API 跟你不不在同⼀一個網
域,你還是往往得準備⼀一台 Server 幫你代打 API
學了了 Vue,你也可以拿來來
寫 iOS app
眉眉⻆角⻆角
Safari 瀏覽器器的問題
<template>
// ⽤用 anchor 會讓 Safari 爛爛掉,但是其他瀏覽器器沒事
<a @click=“doSomething”>Test</a>
// 可以改⽤用 span
<span @click=“doSomething”>Test</span>
</template>
⽀支援可以變成⼿手機桌⾯面圖示的
Web App
• iOS 要加⼊入 apple-touch-icon metatag

• Android 要寫個 Manifest

• Firefox top site 需要個 <link rel=“icon” href=“…”>
iPhone X 的 CSS =_=
• https://webkit.org/blog/7929/designing-websites-for-
iphone-x/

• 要在 HTML 加⼊入 <meta name='viewport' content='initial-
scale=1, viewport-fit=cover’> 才能使⽤用 iPhone X 全螢幕

• 要在 CSS 使⽤用 env(safe-area-inset-left) …等,⽀支援 Safe
Area,如 margin-left: env(safe-area-inset-left) 

• margin-left: calc(env(safe-area-inset-left) + 20px)
SEO
• 純粹⽤用 JS 產⽣生出 DOM,沒有 HTML,搜尋引擎認不不得

• 搜尋引擎找不不到的網站沒⼈人來來

• 所以你還是得做⼀一個讓搜尋引擎抓取資料料的網站

Contenu connexe

Tendances

Angular components
Angular componentsAngular components
Angular componentsSultan Ahmed
 
Android activity lifecycle
Android activity lifecycleAndroid activity lifecycle
Android activity lifecycleSoham Patel
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南Shengyou Fan
 
Iterative Waterfall model
Iterative Waterfall modelIterative Waterfall model
Iterative Waterfall modelAnmol Purohit
 
Docker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker, Inc.
 
Android app development
Android app developmentAndroid app development
Android app developmentTanmoy Roy
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇Shengyou Fan
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and PracticeBo-Yi Wu
 
Unit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptxUnit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptxMalla Reddy University
 
Introduction to webassembly
Introduction to webassemblyIntroduction to webassembly
Introduction to webassemblyGabriele Falasca
 
Kotlin vs Java | Edureka
Kotlin vs Java | EdurekaKotlin vs Java | Edureka
Kotlin vs Java | EdurekaEdureka!
 
Introduction to Mobile Development
Introduction to Mobile DevelopmentIntroduction to Mobile Development
Introduction to Mobile DevelopmentPragnesh Vaghela
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to DockerAditya Konarde
 
A Introduction of Packer
A Introduction of PackerA Introduction of Packer
A Introduction of PackerFreyr Lin
 

Tendances (20)

Angular components
Angular componentsAngular components
Angular components
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
 
Android activity lifecycle
Android activity lifecycleAndroid activity lifecycle
Android activity lifecycle
 
Docker
DockerDocker
Docker
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南
 
Iterative Waterfall model
Iterative Waterfall modelIterative Waterfall model
Iterative Waterfall model
 
Docker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to Docker
 
Android app development
Android app developmentAndroid app development
Android app development
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
 
Creating Apps with .NET MAUI
Creating Apps with .NET MAUICreating Apps with .NET MAUI
Creating Apps with .NET MAUI
 
Android ppt
Android pptAndroid ppt
Android ppt
 
Unit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptxUnit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptx
 
Rxjs ppt
Rxjs pptRxjs ppt
Rxjs ppt
 
Introduction to webassembly
Introduction to webassemblyIntroduction to webassembly
Introduction to webassembly
 
Kotlin vs Java | Edureka
Kotlin vs Java | EdurekaKotlin vs Java | Edureka
Kotlin vs Java | Edureka
 
Introduction to Mobile Development
Introduction to Mobile DevelopmentIntroduction to Mobile Development
Introduction to Mobile Development
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
A Introduction of Packer
A Introduction of PackerA Introduction of Packer
A Introduction of Packer
 

Similaire à 給 iOS 工程師的 Vue.js 開發

JSDC 2015 React-Native 實戰
JSDC 2015 React-Native 實戰JSDC 2015 React-Native 實戰
JSDC 2015 React-Native 實戰Sam Lee
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
 
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山imShining @DevCamp
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述kevin_yanggl
 
Study4 love.2016.2.20.ionic
Study4 love.2016.2.20.ionicStudy4 love.2016.2.20.ionic
Study4 love.2016.2.20.ionicKyle Shen
 
视图模式
视图模式视图模式
视图模式Li Zhang
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile ServicesKuo-Chun Su
 
建站大业,实战ASP.NET 4
建站大业,实战ASP.NET 4建站大业,实战ASP.NET 4
建站大业,实战ASP.NET 4Cat Chen
 
以HTML5和COIMOTION打造跨平台App
以HTML5和COIMOTION打造跨平台App以HTML5和COIMOTION打造跨平台App
以HTML5和COIMOTION打造跨平台AppBen Lue
 
Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
HTML5概览
HTML5概览HTML5概览
HTML5概览Adam Lu
 
利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式Chui-Wen Chiu
 
使用 ASP.NET 5 實戰開發雲端應用程式
使用 ASP.NET 5 實戰開發雲端應用程式使用 ASP.NET 5 實戰開發雲端應用程式
使用 ASP.NET 5 實戰開發雲端應用程式Will Huang
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践Du Yamin
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践jay li
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门Xiujun Ma
 

Similaire à 給 iOS 工程師的 Vue.js 開發 (20)

JSDC 2015 React-Native 實戰
JSDC 2015 React-Native 實戰JSDC 2015 React-Native 實戰
JSDC 2015 React-Native 實戰
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
 
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山
凡客移动应用之Android + HTML5技术运用 | 凡客 汪健飞 徐金山
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述
 
Study4 love.2016.2.20.ionic
Study4 love.2016.2.20.ionicStudy4 love.2016.2.20.ionic
Study4 love.2016.2.20.ionic
 
Vue.js
Vue.jsVue.js
Vue.js
 
视图模式
视图模式视图模式
视图模式
 
I os 16
I os 16I os 16
I os 16
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 
建站大业,实战ASP.NET 4
建站大业,实战ASP.NET 4建站大业,实战ASP.NET 4
建站大业,实战ASP.NET 4
 
以HTML5和COIMOTION打造跨平台App
以HTML5和COIMOTION打造跨平台App以HTML5和COIMOTION打造跨平台App
以HTML5和COIMOTION打造跨平台App
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
HTML5概览
HTML5概览HTML5概览
HTML5概览
 
利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式
 
使用 ASP.NET 5 實戰開發雲端應用程式
使用 ASP.NET 5 實戰開發雲端應用程式使用 ASP.NET 5 實戰開發雲端應用程式
使用 ASP.NET 5 實戰開發雲端應用程式
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践
 
淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践淘宝移动端Web开发最佳实践
淘宝移动端Web开发最佳实践
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 

Plus de Weizhong Yang

怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google MapsWeizhong Yang
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情Weizhong Yang
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事Weizhong Yang
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsWeizhong Yang
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 APIWeizhong Yang
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程Weizhong Yang
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼Weizhong Yang
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 CodeWeizhong Yang
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingWeizhong Yang
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIWeizhong Yang
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統Weizhong Yang
 

Plus de Weizhong Yang (20)

Flutter BLE
Flutter BLEFlutter BLE
Flutter BLE
 
怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情
 
Dart null safety
Dart null safetyDart null safety
Dart null safety
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事
 
Github Actions
Github ActionsGithub Actions
Github Actions
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing Aids
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
貪食蛇
貪食蛇貪食蛇
貪食蛇
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
Html 5 native drag
Html 5 native dragHtml 5 native drag
Html 5 native drag
 
Retina mac
Retina macRetina mac
Retina mac
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統
 
Refactoring
RefactoringRefactoring
Refactoring
 
Core animation
Core animationCore animation
Core animation
 

給 iOS 工程師的 Vue.js 開發

  • 2. 最近我在做網站 • 因為我的 iOS App ⼀一直被蘋果退件,總點做點別的 • iOS ⼯工程師最好還是學⼀一些 Web 開發技能 • iOS 不不會被 Android 取代,但是 Native App 很有可能被 Web App 取代 • 做了了 Web 版本,包在 Electron 裡頭,等於做好了了所有的 Desktop 版本
  • 3.
  • 5.
  • 9. 起初 Web 是很單純的 • 瀏覽器器就是個「可以透過網路路抓取、閱讀某種可以互相連 結的⽂文件」的軟體 • 瀏覽器器對 Web Server 發送 HTTP 連線,取得 HTML ⽂文件 • 瀏覽器器將 HTML ⽂文件直譯成 DOM • 瀏覽器器將 DOM 渲染成在螢幕上顯示的結果
  • 10. Server Side 動態網⾴頁 • WWW Server 接受外部傳⼊入的參參數數,根據參參數數,回傳不不同 的 HTML ⽂文件 • 可以⽤用 GET、POST…等⽅方式傳⼊入參參數數 • ASP、PHP…還有⽬目前各種 Web Servre Framework(Rails、Laravel、Django)都在做這種事情
  • 11. 但是偏偏有⼈人想在⽂文件格式裡頭搞 應⽤用程式開發 • 最早的作法是,在 HTML 裡頭挖⼀一塊可以塞⼊入執⾏行行 Native Code 的 drawing context,讓瀏覽器器 Plug-in 渲染內容 • Java Applet、ActiveX、QuickTime…最後 Flash 稱霸了了將 近⼗十年年的時間 • 但是在 2007 年年,有⼀一⽀支⼿手機問世,徹底打倒了了 Flash
  • 12.
  • 13. 動態改變 DOM • DOM 的內容除了了可以從 HTML 當中產⽣生外,也可以由 JavaScript 動態修改(getElementById、addChild…) • JavaScript ⾃自⼰己也可以發送網路路連線(AJAX),然後⽤用抓 到的資料料改變⾴頁⾯面中部分的資料料 • 最後 DOM 都可能不不是從 HTML 產⽣生,⽽而都是⽤用 JavaScript 產⽣生的,只⽤用 JS 與 DOM 產⽣生的應⽤用,稱為 Single Page Application(SPA)
  • 14. 這年年頭的 SPA • 你可能不不是直接去寫直接讓瀏覽器器閱讀的 HTML 與 JS • ⽽而是先寫某個其他格式的東⻄西,然後由特殊⼯工具打包成最 後發⾏行行的版本 • 瀏覽器器不不認得 ES6、TypeScript…所以⽤用 Babel 翻譯成瀏覽 器器認得的 JS • 然後把分散的 JS、Asset…透過 Web Pack 打包成⼀一⼤大包 JS
  • 15. 對 iOS ⼯工程師來來說 • ES6、TypeScript -> JS 可以想成 • Objective-C -> C -> LLVM Bitcode -> Machine Code • 打包 Asset • xib -> nib、storyboard -> storyboardc、xcassets- >Assets.car
  • 18. Vue.js 的檔案組成 • ⼀一個 Vue.js 專案,是由很多個 .vue 檔案組成的 • 每個 .vue 檔案可以想像成類類似 UIKit 的 View Controller 的 東⻄西,每個 .vue 檔案掌控⼀一部分的 DOM 元件與邏輯
  • 19. ⼀一個 .vue 檔案 // 這部份像是 .xib 檔案 <template>
 </template> <style>
 </style> // 這部份像是你的 View Controller <script>
 </script>
  • 20. <script> export default { name: 'my-view', data () { // private properties return { 'data_key': 'data_value' } } props: ['prop_key'], // public properties watch: { // KVO data_key: () => { } }, created: () => { // init }. methods () { // private methods login() { } }, computed: { // 晚點說 } } </script>
  • 21. <template> <div> <p> {{ data_key }} </p> <button @click=“login”>Action</button> </div> </template>
  • 22. // 另外⼀一個檔案想要使⽤用 my-view <template> <my-view></my-view> </template> <script> import MyView from ‘MyView.vue’ export default { components: {MyView}
 } </script>
  • 23. // 另外⼀一個檔案想要使⽤用 my-view // 綁定 prop <template> <my-view v-bind:prop_key=“prop_value”></my- view> </template>
  • 24. // iOS 的 view state pattern? // 可以使⽤用 v-if 搭配 data <template> <loading v-if=“state==‘loading’”><loading> <error v-if=“state==‘error’”><error> <div v-if=“state==‘completed’”></div> </template> <script> import Loading from ‘Loading.vue’ import Error from ‘Error.vue’ export default { components: {Loading, Error}, data: { return { state: ‘completed’ }
 }
 } </script>
  • 25. // 呼叫 API <script> export default { … methods { callAPI() { axios.get(‘https://..’).then(
 data => { // 要⽤用 nextTick
 this.$nextTick( () => { this.state = ‘completed’ } )})
 }
 }
 } </script>
  • 26. // Collection View 與 Table View? // 可以使⽤用 v-for <template> <div v-for=“item in items”> </div> </template> <script> export default { data: { return { items: [] }
 }
 } </script>
  • 27. 跨 Vue 檔案之間的溝通? • 要⽤用 Vuex • Vuex 是⼀一個超⼤大的共⽤用物件,每個 .vue 檔案,可以⽤用 this.$store 拿到這個物件 • 所有 .vue 檔案都透過 this. $store.dispatch(‘function_name’) 改變 vuex 的狀狀態 • vuex 被修改之後,⽤用到某個共⽤用狀狀態的 .vue,會透過 computed 收到修改
  • 28. ⽤用⼒力力給他跑下去 • npm install • npm run dev • npm run build // 編譯 electron 版本 • npm run build:web // 編譯網⾴頁版
  • 29. ⼀一些對應 • UITableView -> HTML Table • UICollectionView -> CSS Grid • UINavigationController、UITabBarController -> Route View • NSURLSession -> XHR(XMLHttpRequests)、Axois… • NSUserDefaults -> Local Storage
  • 31. JavaScript 的⾏行行為
 跟你想的完全不不⼀一樣 • JS 的 for..in 不不是給 Array ⽤用的,⽽而是對所有物件都可以 ⽤用,是列列舉某個物件的所有 property… • JS 的 let 是產⽣生 block scope 的變數數,var 是產⽣生 function scope 的變數數…
  • 32. CORS • Cross-Origin Resource Sharing • 簡單講,寫 app 可以直接打 API,但是網⾴頁上⾯面預設不不允 許抓取跟你不不在同⼀一個網域的 API 的資料料 • 除⾮非對⽅方 API server 帶了了像「Access-Control-Allow- Origin: *」的 HTTP Header,即使有,遇到了了 302 redirect,也⼀一樣抓不不到 • 所以就算你寫⼀一個 JS App,但是 API 跟你不不在同⼀一個網 域,你還是往往得準備⼀一台 Server 幫你代打 API
  • 35. Safari 瀏覽器器的問題 <template> // ⽤用 anchor 會讓 Safari 爛爛掉,但是其他瀏覽器器沒事 <a @click=“doSomething”>Test</a> // 可以改⽤用 span <span @click=“doSomething”>Test</span> </template>
  • 36. ⽀支援可以變成⼿手機桌⾯面圖示的 Web App • iOS 要加⼊入 apple-touch-icon metatag • Android 要寫個 Manifest • Firefox top site 需要個 <link rel=“icon” href=“…”>
  • 37. iPhone X 的 CSS =_= • https://webkit.org/blog/7929/designing-websites-for- iphone-x/ • 要在 HTML 加⼊入 <meta name='viewport' content='initial- scale=1, viewport-fit=cover’> 才能使⽤用 iPhone X 全螢幕 • 要在 CSS 使⽤用 env(safe-area-inset-left) …等,⽀支援 Safe Area,如 margin-left: env(safe-area-inset-left) • margin-left: calc(env(safe-area-inset-left) + 20px)
  • 38. SEO • 純粹⽤用 JS 產⽣生出 DOM,沒有 HTML,搜尋引擎認不不得 • 搜尋引擎找不不到的網站沒⼈人來來 • 所以你還是得做⼀一個讓搜尋引擎抓取資料料的網站