本帖最後由 javacomhk 於 2022-5-19 10:53 編輯
(A) 第一部份新增項目 folder,安裝 Framework、Library 及建立初始項目檔案
如果是 Windows WSL2 用戶就要例如 Ubuntu 內安裝完 nodejs 後更新 nodejs version 去最少 V12
參考 https://docs.microsoft.com/en-us ... cript/nodejs-on-wsl
(A1) 打開 Linux Terminal輸入以下指令- sudo apt update
- sudo apt install nodejs npm wget git
- mkdir -p ~/webappreact
- cd ~/webappreact
- npm init -y
複製代碼 (A2) 將以下文件 ~/webappreact/package.json 更改內容為- {
- "name": "webappreact",
- "version": "1.0.0",
- "description": "",
- "scripts": {
- "glogin": "clasp login",
- "glogout": "clasp logout",
- "gcreate": "clasp create --title 'React Test Project' --rootDir ./apps-script",
- "gpush": "clasp push",
- "gpull": "clasp pull",
- "gstart": "clasp push --watch",
- "build": "parcel build src/index.html --dist-dir ./apps-script",
- "start": "parcel src/index.html --dist-dir ./apps-script"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "optionalDependencies": []
- }
複製代碼 (A3) 打開 Linux Terminal 輸入以下指令安裝 JavaScript Framework- # install dependencies
- npm install -D @google/clasp
- npm install -D @types/google-apps-script # if you use VS Code Editor in ChromeOS
- npm install -D parcel
- npm install react react-dom
- npm install react-router-dom@6
複製代碼 如果使用 VS code Editor,就要安裝 @types/google-apps-script
(A4) 打開 Linux Terminal 輸入以下指令新增以下 folders- mkdir -p ~/webappreact/src
- mkdir -p ~/webappreact/src/styles
- mkdir -p ~/webappreact/src/components
- mkdir -p ~/webappreact/apps-script
複製代碼 (A5) 新增以下文件 ~/webappreact/src/index.html 內容為
由於這個 forum 唔比 post HTML code,所以唯有 post image。
如果用 VS Code Editor,你打 html:5 就會出現這段類似的 code snippet,修改下就可以用。
(A6) 新增以下文件 ~/webappreact/src/index.js 內容為- import React from "react"
- import { BrowserRouter } from "react-router-dom"
- import App from "./App"
- import { createRoot } from 'react-dom/client';
- const container = document.getElementById('app');
- const root = createRoot(container);
- root.render(<BrowserRouter><App /></BrowserRouter>)
複製代碼 (A7) 新增以下文件 ~/webappreact/src/App.js 內容為- import { Routes, Route } from "react-router-dom"
- import Home from "./components/Home"
- import About from "./components/About"
- import Nav from "./components/Nav"
- function App() {
- return <>
- <Nav />
- <Routes>
- <Route path="/" element={<Home />} />
- <Route path="about" element={<About />} />
- <Route path="*" element={<Home />} />
- </Routes>
- </>
- }
- export default App
複製代碼 (A8) 新增以下文件 ~/webappreact/src/styles/main.scss 內容為- .App {
- text-align: center;
- }
- .App-logo {
- height: 40vmin;
- pointer-events: none;
- }
- .App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
- }
- .App-link {
- color: #61dafb;
- }
- .h1 {
- color:green;
- font-size: 2rem;
- }
- .css-nav {
- padding: 15px;
- }
複製代碼 (A9) 新增以下文件 ~/webappreact/src/components/Home.js 內容為- function Home() {
- return <>
- <h1 className="h1">HomePage</h1>
- </>
- }
- export default Home
複製代碼 (A10) 新增以下文件 ~/webappreact/src/components/About.js 內容為- function About() {
- return <>
- <h1 className="h1">About</h1>
- </>
- }
- export default About
複製代碼 (A11) 新增以下文件 ~/webappreact/src/components/Nav.js 內容為- import { Link } from "react-router-dom"
- function Nav() {
- return <>
- <span className="css-nav"><Link to="/">Home</Link></span>
- <span className="css-nav"><Link to="/about">About</Link></span>
- </>
- }
- export default Nav
複製代碼 (A12) 打開 Linux Terminal 輸入以下指令進行第一次本地 localhost:1234 Browser 測試- # Test building
- cd ~/webappreact
- #如果只在 localhost 做測試UI 可以唔使 build 只要儲存修改好的檔案便可
- #npm run build
- # Test running in localhost:1234
- npm run start
複製代碼 (A13) Linux 用戶可以在 Firefox 內安裝 React Developer Tools 進行測試及Debug。或加安裝 Google Chrome Browser 及 Chrome Web Store 內 React Developer Tools 去進行測試及Debug。
Debug 的方法是 Right Click 個網頁選擇 Inspect Element 後就可以選擇 Elements 或 Console 去睇 Elements 內的 html tag/style 或 JavaScript code 或者 Console/Error Logs 或使用 React Developer Tools 新增的 Components 及 Profiler Tab 。React Developer Tools 的使用可參考 https://www.digitalocean.com/com ... act-developer-tools
(B) 第二部份修改 code 內容及 推送(push) 到 Google Apps Script 部署(Deploy) 為 WebApp,及測試比較
(B1) 修改以下文件 ~/webappreact/src/App.js 內容為- import { Routes, Route } from "react-router-dom"
- import Home from "./components/Home"
- import About from "./components/About"
- import Data from "./components/Data"
- import Nav from "./components/Nav"
- function App() {
- return <>
- <Nav />
- <Routes>
- <Route path="/" element={<Home />} />
- <Route path="/about" element={<About />} />
- <Route path="/data" element={<Data />} />
- <Route path="*" element={<Home />} />
- </Routes>
- </>
- }
- export default App
複製代碼 (B2) 修改以下文件 ~/webappreact/components/Nav.js 內容為- import { Link } from "react-router-dom"
- function Nav() {
- return <>
- <span className="css-nav"><Link to="/">Home</Link></span>
- <span className="css-nav"><Link to="about">About</Link></span>
- <span className="css-nav"><Link to="data">Data</Link></span>
- </>
- }
- export default Nav
複製代碼 (B3) 新增以下文件 ~/webappreact/src/components/Data.js 內容為- import React, {useState, useEffect} from "react"
- function Data() {
- const [data,setData] = useState(null)
- const [loading, setLoading] = useState(false)
- if (typeof google === 'object') {
- useEffect(()=>{
- setLoading(true)
- google.script.run.withSuccessHandler(response => {
- setData([...response])
- setLoading(false)
- //console.log(JSON.stringify(data))
- }).withFailureHandler(er => {
- alert(er)
- }).getData()
- },[])
- }
- else {
- return <>
- <h1 className="h1">Test getData from local host</h1>
- <table>
- <tbody>
- <tr>
- <td><span style={{padding:'30px'}}>key: row.key</span></td>
- <td><span style={{padding:'30px'}}>value: row.value</span></td>
- </tr>
- </tbody>
- </table>
- </>
- }
- if (loading) return <h1>loading...</h1>
- if (!data) return null;
- console.log(JSON.stringify(data))
- return <>
- <h1 className="h1">Test getData from Google Web App</h1>
- <table>
- <tbody>
- {
- data.map((row) => (
- <tr>
- <td><span style={{padding:'30px'}}>key: {row.key}</span></td>
- <td><span style={{padding:'30px'}}>value: {row.value}</span></td>
- </tr>
- ))
- }
- </tbody>
- </table>
- </>
- }
- export default Data
複製代碼 (B4) 新增以下文件 ~/webappreact/apps-script/main.js 內容為- function doGet() {
- return HtmlService.createTemplateFromFile("index")
- .evaluate()
- .addMetaTag("viewport","width=device-width, initial-scale=1.0")
- }
- function getData() {
- return (
- [{
- "key": "apple",
- "value": "green"
- },
- {
- "key": "banana",
- "value": "yellow"
- }]
- );
- }
- function getSpreadData() {
- return SpreadsheetApp
- .getActiveSpreadsheet()
- .getActiveSheet()
- .getDataRange()
- .getValues();
- }
複製代碼 (B5) 新增及修改完 Code 後就可以 準備推送(push) 個 build 好嘅 Single Page App (SPA) 去 Google Drive 度。在推送(push)之前,首先用 Browser Login Google Account 及去 https://script.google.com/home/usersettings 去開啟(enable) Google Apps Script API,如下圖:
(B6) 然後需要在 Project folder Login 及取得 Authentication token 及 create project, 打開 Linux Terminal 輸入以下指令- cd ~/webappreact
- # Login in to google apps script
- npm run glogin
- # Login 後就會將個 Authentication toke 儲在 project folder 下
- # Create Project in google apps script and choose sheets
- npm run gcreate
- # 選擇 sheets 後就會在你的 Google Drive 內新增一個 Google Sheets 檔案叫 React Test Project,內里就會有你的 WebApp Code, Apps Script Code 及 Spreadsheets data
- # Move the .clasp.json to proper place before push
- mv ~/webappreact/apps-script/.clasp.json ~/webappreact/
- # Build and Push the SPA (index.html) and the Apps Script to React Test Project
- npm run build
- npm run gpush
複製代碼 (B7) 個WebApp 是需要 Deploy to WebApp 才可測試,首先用 Browser 去 drive.google.com
選擇 Recent 找到 React Test App 的 Spreahsheet 檔案 Double Click 打開佢,開啟 menu 的 Extensions 下的 Apps Script 就可進入 Google Apps Script Editor,然後選擇右上角藍色的 Deploy Button 後選擇 New Deployment,Select type 內選擇 Web app再 Click Done Button。然後再選擇右上角藍色的 Deploy Button 後選擇 Test developments 找到 Web app URL的地址 Copy 後用 Browser 進入測試。
(B8) 每次修改完 Code 後要在 localhost 測試,可以打開 Linux Terminal 輸入以下指令然後用 Browser 去 http://localhost:1234 測試- cd ~/webappreact
- #如果只在 localhost 做測試UI 可以唔使 build 只要儲存修改好的檔案便可
- #npm run build
- npm run start
複製代碼 (B9) 每次修改完 Code 後要在 Google WebApp 測試,就要重覆 build 及 gpush 如下,(B6) 的 Test Deployment 步驟,不需重覆。只要是Browser 是同一 Google Login 戶口便可以測試。- cd ~/webappreact
- npm run build
- npm run gpush
複製代碼 (B10) 在 localhost (如左邊圖) 及在 Google WebApp (如右邊圖) 測試的結果會不同, 在 localhost 會使用 testing data然後顯示出來,在 Google Server 的 WebApp 則會取用 Google Apps Script function 內的 backend server data。
|