最近看看 openlayers , 發現好像 vue3 支援度比較友善 , 不然 angular 太殘了 XD
之前做些小東東都用 js , 這次想說玩看看 ts 結果馬上陣亡 XD
volar
vue3 要搞 ts 的話要先安裝 Vue Language Features Volar
並且還要裝 TypeScript Vue Plugin Volar
然後輸入 @builtin typescript 也要 disable (Workspace)
可以看參考下這個影片
或是這個說明
可以順便在 settings.json 設定讓當輸入 ref 以後 .value 自動跳
1
   | "vue.autoInsert.dotValue": true
   | 
 
eslint
先安裝 eslint
還有 Prettier - Code formatter
增加 overrides 那段 , 不然 html 會噴 error
.eslintrc.cjs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | /* eslint-env node */ require('@rushstack/eslint-patch/modern-module-resolution')
  module.exports = { 	root: true, 	extends: [ 		'plugin:vue/vue3-essential', 		'eslint:recommended', 		'@vue/eslint-config-typescript', 		'@vue/eslint-config-prettier/skip-formatting' 	], 	parserOptions: { 		ecmaVersion: 'latest' 	}, 	overrides: [ 		{ 			files: ['*.html'], 			rules: { 				'vue/comment-directive': 'off' 			} 		} 	] }
   | 
 
設定 .prettierrc.json
1 2 3 4 5 6 7 8 9 10
   | {     "$schema": "https://json.schemastore.org/prettierrc",     "semi": false,     "useTabs": true,     "tabWidth": 4,     "singleQuote": true,     "printWidth": 100,     "trailingComma": "none"     "singleAttributePerLine" : true }
  | 
 
開啟 settings.json 加入以下設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | "eslint.enable": true, "eslint.validate": [     // "html",     // "javascript",     "vue" ], "editor.codeActionsOnSave": {     "source.fixAll.eslint": true }, "editor.defaultFormatter": "esbenp.prettier-vscode", "[vue]": {     "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascript]": {     "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[html]": {     "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": {     "editor.defaultFormatter": "esbenp.prettier-vscode" },
   | 
 
openlayers
1 2 3 4 5
   | npm create vue@latest cd .\demomap-vue\ npm install npm run format npm run dev
   | 
 
vue3openlayers
openlayers 文件
1 2 3 4
   | npm install npm install ol ol-ext ol-contextmenu npm install vue3-openlayers npm run dev
   | 
 
MapDemo.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
   | <template> 	<ol-map style="height: 400px"> 		<ol-view 			ref="view" 			:center="center" 			:rotation="rotation" 			:zoom="zoom" 			:projection="projection" 			@change:center="centerChanged" 			@change:resolution="resolutionChanged" 			@change:rotation="rotationChanged" 		/>
  		<ol-tile-layer> 			<ol-source-osm /> 		</ol-tile-layer>
  		<ol-rotate-control></ol-rotate-control> 	</ol-map>
  	<ul> 		<li>center : {{ currentCenter }}</li> 		<li>resolution : {{ currentResolution }}</li> 		<li>zoom : {{ currentZoom }}</li> 		<li>rotation : {{ currentRotation }}</li> 	</ul> </template>
  <script setup lang="ts"> import type { ObjectEvent } from 'ol/Object' import { ref } from 'vue'
  const center = ref([40, 40]) const projection = ref('EPSG:4326') const zoom = ref(8) const rotation = ref(0)
  const currentCenter = ref(center.value) const currentZoom = ref(zoom.value) const currentRotation = ref(rotation.value) const currentResolution = ref(0)
  function resolutionChanged(event: ObjectEvent) { 	currentResolution.value = event.target.getResolution() 	currentZoom.value = event.target.getZoom() } function centerChanged(event: ObjectEvent) { 	currentCenter.value = event.target.getCenter() } function rotationChanged(event: ObjectEvent) { 	currentRotation.value = event.target.getRotation() } </script>
   | 
 
App.vue
1 2 3 4 5 6 7 8 9 10 11 12 13
   | <script setup lang="ts"> import MapDemo from './components/MapDemo.vue' </script>
  <template> 	<MapDemo id="map" /> </template>
  <style scoped> #map { 	height: 400px; } </style>
   | 
 
vite.config.ts
因為要讓他可以對外 , 所以補下 server 那段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | import { fileURLToPath, URL } from 'node:url'
  import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue'
  // https://vitejs.dev/config/ export default defineConfig({ 	plugins: [vue()], 	resolve: { 		alias: { 			'@': fileURLToPath(new URL('./src', import.meta.url)) 		} 	}, 	server: { 		host: '0.0.0.0', 		port: 4000 	} })
  |