h5项目选用taro框架感觉不太好,很多API是在小程序环境 得到支持的,在h5端的支持度都没有写明可不可以用,比如
1 2 3 npm install -g @tarojs/cli taro init myApp npm run dev:h5
可能会出现的问题,network_error 服务器错误,记得把fan qiang软件的全局模式切掉。这个问题貌似只在初次dev的时候出现过,之后开全局也能正常dev,之后好好学计网吧,现在我也不太懂.npm run dev:h5
后可以看到:
况且taro中封装了太多东西,一方面可以提高生产效率,但另外一方面也降低了对技术的要求,比如了解web API的使用,比如规范化css类名,比如构建页面路由,比如http request。
当你在本地改了代码甚至不需要手动刷新浏览器,就可以看到更改,这依赖于wepack HMR 功能。
当你ctrl + c退出后,可以看到如上,使用 HMR 的过程中,(有人说)通过 Chrome 开发者工具知道浏览器是通过websocket 和webpack-dev-server 进行通信的,感觉webpack-dev-server是一个很值得研究的东西。
定位+位置比对 使用navigator.geolocation.getCurrentPosition
web API 获取经纬度,不同浏览器可能使用的地理信息服务,通过调试可知,qq浏览器使用的是google服务。然而google位置获取服务 已经不再支持http了……
项目需求的情景是给用户推荐附近食堂菜单,所以必然要涉及到距离测算。这里我使用腾讯位置服务 其中有两个比较难搞的点。
MD5加密 在进行配置的时候,可以看到如下,如果使用的是签名校验验证方法,则会涉及md5加密算法。
md5并不是js内置的方法,所以要外部引入,引入可以用npm install
相关包,也可以直接copy 源代码。js版本的md5 在github上也挺好找的。做适量更改。
1 2 3 4 5 export default md5import md5 from './md5.min.js' ;let sig = md5('/ws/distance/v1/?from=28.983171,116.308479&key=BQBBZ-TRBCW-J3WRO-OUTER-XXXXXX&mode=driving&to=28.996060,116.353455;28.949227,116.3943108kjYTMrC9zaOW9xTLS5N3EnB7HWviv' );
建议在md5.min.js
run得到sig后在postman测试一下。排除一下配置错误,当然你之后就会发现会在浏览器中碰到postman中不会有的跨域问题,嘿嘿嘿😁……
如error所示,No ‘Access-Control-Allow-Origin’ header is present on the requested resource.在项目中使用 request
调用腾讯接口,会得到类似的错误,然而这是第三方服务,所以无法做到让服务器在响应首部中添加该字段。注意到该接口接受到JSONP 回调。
使用script标签调用接口后会返回一段js代码。在下面的情景中,则是接口的 responce
会成为globalFun的参数,返回 globalFun(res)
这个函数,实际上就将这个函数执行了。记得要将回调函数 globalFun
定义在全局可访问的位置。不然只定义在调用接口的页面,你会发现 undefined
的报错。
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 <script> function globalFun (obj ) { console .log("globalfun" ); console .log(obj); console .log(obj.result.elements); let res = JSON .stringify(obj); window .localStorage.setItem('resJson' , res); } </script> / / components/ page/shake/index.jsxuseWebService(pos){ console .log('useWebService' ); let sig = md5('/ws/distance/v1/?' +'callback=globalFun' +'&from=' +pos.coords.latitude+',' +pos.coords.longitude +'&key=BQBBZ-TRBCW-J3WRO-OUTER-------' +'&mode=walking' +'&output=jsonp' +'&to=28.086060,115.053455;28.069227,116.044310' +'8kjYTMrC9zaOW9xTLS5N------' ) const script = document .createElement("script" ); script.src = 'https://apis.map.qq.com/ws/distance/v1/?' +'callback=globalFun' +'&from=' +pos.coords.latitude+',' +pos.coords.longitude +'&key=BQBBZ-TRBCW-J3WRO-OUTER------' +'&mode=walking' +'&output=jsonp' +'&to=28.086060,115.053455;28.069227,116.044310' +'&sig=' +sig; script.async = false ; document .body.appendChild(script); }
摇动监测
部分代码如下:
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 export default Shake;componentDidMount() { const system = Taro.getStorageSync('system' ); if (system == "iOS" ){ if (typeof (DeviceMotionEvent) !== 'undefined' &&typeof DeviceMotionEvent.requestPermission === "function" ){ DeviceMotionEvent.requestPermission() .then(response => { alert("Orientation tracking " + response); if (response == "granted" ) { var myShakeEvent = new Shake(); myShakeEvent.start(); window .addEventListener('shake' , this .shakeEventDidOccur, false ); }else { alert('您已拒绝请求,将无法获得摇一摇响应,可重新载入页面,允许请求~' ) } }) .catch(console .error); } }else { var myShakeEvent = new Shake(); myShakeEvent.start(); window .addEventListener('shake' , this .shakeEventDidOccur, false ); } }
项目调试 本地跑项目,直接在浏览器中使用开发者工具即可。若想要真机调试,推荐使用Chrome远程调试 。
如果需要对devServer环境进行配置,参照webpack devServer 配置,可按如下: 配置了本地可信任ssl证书,可其实对我想获得https信赖来调试定位起不到作用,因为本地信任,而做不到公网信任啊……所以只能用github pages 生成预览页面,抽出来测试需要https的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var fs = require ('fs' );h5: { devServer:{ https:{ key: fs.readFileSync('/Users/mac/Desktop/example-cert/server.key' ), cert: fs.readFileSync('/Users/mac/Desktop/example-cert/server.crt' ), ca: fs.readFileSync('/Users/mac/Desktop/example-cert/rootCA.pem' ), } host: "localhost" , port:10086 , proxy:{ '/api' :{ target:'http://food.test.muxixyz.com/' , changeOrigin:'true' } } }, }
ECS+Nginx部署 部署步骤待更新,先说一个避坑地方:nginx 更新部署失败(视觉上的失败……)