開發人員如要將資訊主頁、Look 或探索嵌入網頁應用程式,可以使用 iframe 嵌入 Looker 內容,本教學課程針對想要在 React 應用程式中加入 Looker 圖表的開發人員,介紹另一種方法。本教學課程以 Create React App 啟動器為基礎,並使用 Looker 圖表元件。
本教學課程涵蓋的步驟如下:
從 Looker 取得查詢代碼
由於 React 應用程式會依賴 Looker,因此您必須在 Looker 中執行一些操作。
取得查詢短代
您需要查詢 ID 或短代碼,做為視覺化元件的道具。本文將說明如何從探索網址取得查詢代碼。
在 Looker 執行個體中設定 CORS
跨源資源共享 (CORS) 會由與嵌入相同的網域許可清單控制。
詳情請參閱「已簽署的嵌入」說明文件頁面。
- 在 Looker 執行個體中,依序前往「管理」>「平台嵌入」。這項操作需要管理員權限。
- React 應用程式預設會在
http://localhost:3000
執行。將這個地址加入內嵌網域許可清單,即可告訴 Looker 允許應用程式提出的要求,並使用相同的地址回應這些要求。這個步驟是必要的,因為應用程式會向 Looker 執行 API 要求,否則 Looker 和應用程式之間就不會進行通訊。
建立 React 應用程式
這個示範的前端使用 Create React App 建立單頁 React 應用程式。在示範項目的根資料夾 (get-started-viz-components
) 中執行下列指令,建立應用程式並安裝依附元件:
npx create-react-app frontend-react cd frontend-react npm i
@looker/visualizations npm i @looker/components @looker/components-data
styled-components
執行這些指令後,您的資料夾結構應如下所示:
檢查 package.json
檔案,確認是否已安裝 react-dom
,否則請執行 npm i react-dom
進行安裝。
這個示範的 package.json
如下所示:
{
"name": "frontend-react",
"version": "0.1.0",
"private": true,
"dependencies": {
"@looker/components": "^4.0.3",
"@looker/components-data": "^1.0.0",
"@looker/sdk": "^22.16.0",
"@looker/sdk-rtl": "^21.4.0",
"@looker/visualizations": "^1.1.1",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.1.0",
"@testing-library/user-event": "^12.4.0",
"i": "^0.3.7",
"npm": "^8.19.2",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"react-scripts": "5.0.1",
"styled-components": "^5.3.6",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
設定環境變數
在應用程式的根目錄 (./frontend-react
) 中建立 .env
檔案,並設定下列變數:
REACT_APP_LOOKER_API_HOST=https://your-looker-instance.looker.com
REACT_APP_BACKEND_SERVER=http://localhost:3001/
REACT_APP_BACKEND_SERVER
是後端輔助服務的地址,我們會使用該地址向 Looker 發出 API 呼叫,以便擷取存取權杖。
REACT_APP_LOOKER_API_HOST
是 Looker 執行個體的地址,會接收來自 React 應用程式的 API 要求。
初始化用戶端 SDK
React 應用程式會使用 SDK 向 Looker 伺服器提出 API 要求。由於這項操作是在前端完成,您可以使用下列輔助程式來初始化 sdk
:
import { Looker40SDK } from '@looker/sdk'
import {
AuthToken,
AuthSession,
BrowserTransport,
DefaultSettings,
} from '@looker/sdk-rtl'
class SDKSession extends AuthSession {
// This is a placeholder for the fetchToken function.
// It is modified to make it useful later.
async fetchToken() {
return fetch('')
}
activeToken = new AuthToken()
constructor(settings, transport) {
super(settings, transport || new BrowserTransport(settings))
}
// This function checks to see if the user is already authenticated
isAuthenticated() {
const token = this.activeToken
if (!(token && token.access_token)) return false
return token.isActive()
}
// This function gets the current token or fetches a new one if necessary
async getToken() {
if (!this.isAuthenticated()) {
const token = await this.fetchToken()
const res = await token.json()
this.activeToken.setToken(res.user_token)
}
return this.activeToken
}
// This function authenticates a user, which involves getting a new token
// It returns a modified object with a new authorization header.
async authenticate(props) {
const token = await this.getToken()
if (token && token.access_token) {
props.mode = 'cors'
delete props.credentials
props.headers = {
...props.headers,
Authorization: `Bearer ${this.activeToken.access_token}`,
}
}
return props
}
}
// This class sets the fetchToken to use the 'real' address of the backend server.
class SDKSessionEmbed extends SDKSession {
async fetchToken() {
return fetch(`${process.env.REACT_APP_BACKEND_SERVER}`)
}
}
// This creates a new session with the 'real' address of the backend server.
const session = new SDKSessionEmbed({
...DefaultSettings,
base_url: process.env.REACT_APP_LOOKER_API_HOST,
})
// This exports the SDK with the authenticated session
export const sdk = new Looker40SDK(session)
將視覺化資訊嵌入應用程式
您現在已取得圖像的查詢短片 (在本例中為 Jlm4YHPeT3lLGA9UtHjZcA
),且已例項化 sdk
物件,因此下一步是使用 Looker 圖像元件,將圖像嵌入應用程式並進行轉譯:
import { sdk } from '../src/helpers/CorsSession'
import { Query, Visualization } from '@looker/visualizations'
import { DataProvider } from '@looker/components-data'
import { ComponentsProvider } from '@looker/components'
function App() {
return (
<>
<h1>Get started with Looker visualization components</h1>
<ComponentsProvider>
<DataProvider sdk={sdk}>
{/* Change this query slug to match your query slug */}
<Query query="Jlm4YHPeT3lLGA9UtHjZcA">
<Visualization />
</Query>
</DataProvider>
</ComponentsProvider>
</>
)
}
export default App
前端已就緒。您可以新增更多元件、為應用程式新增更多樣式等。
建立後端輔助服務
最後一個步驟是建構後端輔助服務,以便接收來自前端的呼叫,並使用 Looker-Node SDK 驗證使用者、擷取其存取權權杖,然後將其傳回至前端。
為簡化說明,我們將建立一個含有一個端點的 Node 伺服器。伺服器會使用 express
、cors
和 @looker/sdk-node
依附元件。您可以從根目錄 (get-started-viz-components
) 開始執行下列指令:
mkdir backend-node
cd backend-node
npm init -y
npm i express cors @looker/sdk-node
如要從後端驗證 SDK,我們會使用 looker.ini
檔案。如要進一步瞭解如何填入檔案,請前往 SDK-Node 頁面。執行這些指令後,您的資料夾結構應如下所示:
package.json
應如下所示:
{
"name": "looker-embed-backend",
"version": "1.0.0",
"description": "Backend helper service for getting started with Looker Viz components",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"author": "Looker",
"license": "Apache-2.0",
"dependencies": {
"@looker/sdk-node": "^22.16.0",
"cors": "^2.8.5",
"express": "^4.18.2"
}
}
接下來,我們會將這段程式碼新增至新的 server.js
檔案:
const cors = require('cors')
const express = require('express')
const { LookerNodeSDK } = require('@looker/sdk-node')
const port = 3001
const app = express()
// The following init40 method will authenticate using
// the looker.ini file
const sdk = LookerNodeSDK.init40()
app.use(
cors({
origin: '*',
})
)
app.use(express.json())
app.get('/', async (req, res) => {
const userId = await sdk.ok(sdk.me('id'))
const accessToken = await sdk.login_user(userId.id)
const user = {
user_token: accessToken.value,
token_last_refreshed: Date.now(),
}
res.json({ ...user })
})
app.listen(port, async () => {
console.log(`Backend Server listening on port ${port}`)
})
啟動伺服器和 React 應用程式
- 開啟終端機並前往
backend-node
資料夾,然後執行npm start
- 開啟第二個終端機,然後前往
frontend-react
資料夾並執行npm start
- 後端輔助服務和 React 應用程式啟動並執行後,您可以開啟瀏覽器,前往
http://localhost:3000/
查看應用程式中嵌入的視覺化資料。