AI 助理
备案 控制台
开发者社区 开发与运维 文章 正文

【微信小程序 | 实战开发】配置开发环境、生产环境和API

简介: 【微信小程序 | 实战开发】配置开发环境、生产环境和API

配置开发环境、生产环境和API的使用


写在前面:

小程序与普通网页开发的区别

小程序的主要开发语言是 JavaScript ,小程序的开发同普通的网页开发相比有很大的相似性。对于前端开发者而言,从网页开发迁移到小程序的开发成本并不高,但是二者还是有些许区别的。


网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序中,二者是分开的,分别运行在不同的线程中。网页开发者可以使用到各种浏览器暴露出来的 DOM API,进行 DOM 选中和操作。而如上文所述,小程序的逻辑层和渲染层是分开的,逻辑层运行在 JSCore 中,并没有一个完整浏览器对象,因而缺少相关的DOM API和BOM API。这一区别导致了前端开发非常熟悉的一些库,例如 jQuery、 Zepto 等,在小程序中是无法运行的。同时 JSCore 的环境同 NodeJS 环境也是不尽相同,所以一些 NPM 的包在小程序中也是无法运行的。


网页开发者需要面对的环境是各式各样的浏览器,PC 端需要面对 IE、Chrome、QQ浏览器等,在移动端需要面对Safari、Chrome以及 iOS、Android 系统中的各式 WebView 。而小程序开发过程中需要面对的是两大操作系统 iOS 和 Android 的微信客户端,以及用于辅助开发的小程序开发者工具,小程序中三大运行环境也是有所区别的。


如下表:


运行环境 逻辑层 渲染层

iOS JavaScriptCore WKWebView

安卓 V8 chromium定制内核

小程序开发者工具 NWJS Chrome WebView

网页开发者在开发网页的时候,只需要使用到浏览器,并且搭配上一些辅助工具或者编辑器即可。小程序的开发则有所不同,需要经过申请小程序帐号、安装小程序开发者工具、配置项目等等过程方可完成。


话不多说,今天就详细讲一下配置开发环境、生产环境~


一、配置开发环境



对于小程序申请注册还不了解的小伙伴可以看看往期文章,传送门:微信小程序申请注册

首先我们先了解一下微信开发者工具的界面功能



1.1 项目目录:



pages 所有的页面

index 每一个文件夹代表着一个页面,每个页面由四个文件组成

index.js 页面的js文件

index.json 页面的配置文件

index.wxml 页面的html文件

index.wxss 页面的css文件

utils 写公共方法的,也可以不用

app.js 小程序的项目的js,全局只有一个,全局的js文件,小程序的入口

app.json 小程序的全局配置文件

app.wxss 小程序的全局css文件

project.config.json 这个是项目配置文件,一般不动它

sitemap.json 这个是小程序的seo文件

小程序文件结构和传统web对比


结构 传统web 微信小程序

结构 HTML WXML

样式 CSS WXSS

逻辑 Javascript Javascript

配置 无 JSON

通过以上对比得出,传统web 是三层结构。而微信小程序 是四层结构,多了一层 配置.json


1.2 JSON 配置


JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色。


我们可以看到在项目的根目录有一个 app.json 和 project.config.json,此外在 pages/logs 目录下还有一个 logs.json,我们依次来说明一下它们的用途。


小程序全配置 app.json

app.json 是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等。QuickStart 项目里边的 app.json 配置内容如下:


{
  #pages添加页面路由的,添加一个路由,就是添加一个页面,谁的路径在第一个谁就是首页
  "pages": [
    "pages/test/test",
    "pages/index/index",
    "pages/logs/logs" 
  ],
 # "window":主要是配置下拉刷新和头部,以navigation开头的设置是头部,如果要下拉的出来,必须enablePullDownRefresh把这个配置设置成true
  "window": {
    "backgroundTextStyle": "dark",  # 下拉刷新的三个点(light/dark)
    "enablePullDownRefresh": true,  
    "navigationBarBackgroundColor": "#333",  # 头部背景颜色
    "navigationBarTitleText": "python13期",  # 头部文字
    "navigationBarTextStyle": "white"   # 文字颜色(black/white)
  },
# tabBar :主要是配置页面下部的导航。显示顺序是和list里面的顺序一致,list里面最少两项,最多5项。
# 如果页面不在tabBar的list里面,就不会出现导航
  "tabBar": {
    "color": "#ffffff",   # 导航字体颜色
    "selectedColor": "#FFB6C1",  ¥# 导航字体被点击后的颜色
    "backgroundColor": "#333",  # 导航栏背景颜色
    "borderStyle": "white",   # 边框颜色
    "list": [{
      "pagePath": "pages/index/index",  # 导航路径
      "text": "index页面",   # 导航页说明
      "iconPath": "images/icon-2.png",    # 导航图路径
      "selectedIconPath": "images/icon-2-sed.png"   # 导航后图片路径
    },
    {
      "pagePath": "pages/test/test",
      "text": "test页面",
      "iconPath": "images/icon1.png",
      "selectedIconPath": "images/icon1-sed.png" 
    }
   ]
  },
}


pages字段 —— 用于描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪个目录。

window字段 —— 定义小程序所有页面的顶部背景颜色,文字颜色定义等。


1.3 工具配置 project.config.json


通常大家在使用一个工具的时候,都会针对各自喜好做一些个性化配置,例如界面颜色、编译配置等等,当你换了另外一台电脑重新安装工具的时候,你还要重新配置。


考虑到这点,小程序开发者工具在每个项目的根目录都会生成一个 project.config.json,你在工具上做的任何配置都会写入到这个文件,当你重新安装工具或者换电脑工作时,你只要载入同一个项目的代码包,开发者工具就自动会帮你恢复到当时你开发项目时的个性化配置,其中会包括编辑器的颜色、代码上传时自动压缩等等一系列选项。


1.4 页面配置 page.json


这里的 page.json 其实用来表示 pages/logs 目录下的 logs.json 这类和小程序页面相关的配置。


#这个里可以对app.json中的window进行覆盖,如果页面没有配置就走全局,页面配置了,就走页面。但是页面的配置不需要加window,直接配置
{
  "usingComponents": {},
  "navigationBarTitleText":"test144"
}


详情参考页面配置文档


如果你整个小程序的风格是蓝色调,那么你可以在 app.json 里边声明顶部颜色是蓝色即可。实际情况可能不是这样,可能你小程序里边的每个页面都有不一样的色调来区分不同功能模块,因此我们提供了 page.json,让开发者可以独立定义每个页面的一些属性,例如刚刚说的顶部颜色、是否允许下拉刷新等等


1.5 小程序的数据绑定


/ pages/test/test.js
Page({
  /**
   * 页面的初始数据,初话数据是卸载data,里面的。
   */
  data: {
    msg:'own is sb',
    name:"tank",
    num :12,
    num1:1,
    flag:false,
    name_list:[{"name":"jason",love:"piao"},{name:"tank",love:"own"},{name:"egon",love:"洗脚"}],
    tank:{name:"tank",love:"own"},
    color:"blue"
  },
})


1.6 sitemap 配置


微信现已开放小程序内搜索,开发者可以通过 sitemap.json 配置,或者管理后台页面收录开关来配置其小程序页面是否允许微信索引。


具体配置说明


页面收录设置:可对整个小程序的索引进行关闭,小程序管理后台 - 功能 - 页面内容接入 - 页面收录开关;

sitemap 配置:可对特定页面的索引进行关闭

例:所有页面会被微信索引:


{
  "rules":[{
    "action": "allow",
    "page": "*"
  }]
}


配置 path/to/page 页面不被索引,其余页面允许被索引


{
  "rules":[{
    "action": "disallow",
    "page": "path/to/page"
  }]
}


如何调试


当在小程序项目中设置了 sitemap 的配置文件(默认为 sitemap.json)时,便可在开发者工具控制台上显示当前页面是否被索引的调试信息( 最新版本的开发者工具支持索引提示)


1.7 小程序的wxss文件


标签中和原生的html一样都有class和id,我们的样式写在wxss文件,和普通的css没有区别,只是用rpx来代替px,


一般1rpx等于0.5px


wxml文件
```javascript
<view class="cls"></view>
#行内样式写法与原生的没有区别,可以调用变量来做属性值
<view style="color:{{color}}">asdas</view>


wxss文件


.cls{
  width: 400rpx;
  height: 400rpx;
  background-color: blue;
}


注意:


运行的时候是开发环境

发行的时候是生产环境


二、配置生产环境


登录腾讯云


2.1 完成账号关联和实名认证



2.2 进行生产环境初始化:



2.3 (云)服务器环境部署(基于Ubuntu)

nginx安装


nodejs安装


pm2安装


mysql安装


配置HTTPS


四、部署后端项目


进行到这一步,(云)服务器的环境都已经搭好了。接下来我们就来将小程序的后端项目部署到(云)服务器上。


登录微信小程序公众平台


获取AppID(小程序ID),AppSecret(小程序密钥),设置服务器域名(PS:域名需要备案后才能填写。)


下载后端项目官方模板,模板中的server目录即是后端项目


配置server/config.js


将client/config.js复制到小程序前端项目src目录下,并修改配置。

此config.js的作用:主要配置host(后端项目的域名/ip地址端口),便于请求后端接口,访问后端资源。


将后端项目上传至(云)服务器


安装项目依赖


初始化数据库


nginx配置后端项目


启动后端项目(推荐:使用pm2启动并监控)


在utils文件中定义config.js文件

config.js


// baseurl
export const baseApi = function () {
  if (process.env.NODE_ENV === 'development') {
  console.log('开发环境')
  return 'http://ip地址:端口号/cloud_job'
  } else {
  console.log('生产环境')
  return 'https://IP地址/cloud_job'
  }
}
// baseSocket
export const baseSocket = function () {
  if (process.env.NODE_ENV === 'development') {
  console.log('开发环境长链接')
  return 'ws://IP地址:端口号/cloud_job/im'
  } else {
  console.log('生产环境长链接')  
  return 'wss://IP地址/cloud_job/im'
  }
}


2.main.js中引入


import {baseApi} from 'utils/config.js'
baseApi()


3.api.js中引入j进行二次封装request


import {baseApi} from './config.js'
// 封装请求方法
const request = (options, isHidding) => {
  let header = {
  "X-Access-Token": uni.getStorageSync('token') || '',
  "Content-type": options.contentType||"application/json"
  };
  if (!isHidding) {
  // uni.showLoading({
  //  title: "加载中",
  //  mask: true,
  // });
  }
  return new Promise((resolve, reject) => {
  uni.request({
    url: baseApi() + options.url,
    method: options.method || 'GET',
    data: options.data || {},
    header,
    success: (res) => {
    console.log('请求参数:',options.data)
    console.log('请求url:',options.url)
    console.log('接口数据:',res)
    if(res.data.code!=200&&res.data.code!=0){
      setTimeout(()=>{
      uni.showToast({
        title: res.data.message,
        duration: 2000,
        icon:"none"
      });
      },100)
      if(res.data.code==401){
      setTimeout(()=>{
        uni.redirectTo({
        url:'/pages/login/index'
        })
      },2000)
      }
      reject(res.data)
    }else{
      resolve(res.data.result)
    }
    },
    fail: (err) => {
    console.log('eeee',err)
    reject(err)
    },
    // 完成之后关闭加载效果
    complete: () => {
    // uni.hideLoading()
    }
  })
  })
}
// 定义http
const http = (url,method,data,isHidding=true,contentType="application/json") =>{
  let options = {
  url,
  method,
  data,
  contentType
  }
  return new Promise((resolve, reject) => {
  request(options,isHidding).then(res=>{
    resolve(res)
  }).catch(e=>{
    reject(e)
    console.log('错误消息:',e)
  })
  })
}
module.exports = {
  request,
  http
}


上线,腾讯云服务器,后台数据。。。


三、小程序API


小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。组要注意的是:多数API的回调都是异步,你需要处理好代码逻辑的异步问题。详细介绍请参考 API 文档。


通常,在小程序 API 有以下几种类型:


3.1 事件监听 API


我们约定,以 on 开头的 API 用来监听某个事件是否触发,如:wx.onSocketOpen,wx.onCompassChange 等。


这类 API 接受一个回调函数作为参数,当事件触发时会调用这个回调函数,并将相关数据以参数形式传入。


代码示例:


wx.onCompassChange(function (res) {
  console.log(res.direction)
})


3.2 同步 API


我们约定,以 Sync 结尾的 API 都是同步 API, 如 wx.setStorageSync,wx.getSystemInfoSync 等。此外,也有一些其他的同步 API,如 wx.createWorker,wx.getBackgroundAudioManager 等,详情参见 API 文档中的说明。


同步 API 的执行结果可以通过函数返回值直接获取,如果执行出错会抛出异常。


代码示例


try {
  wx.setStorageSync('key', 'value')
} catch (e) {
  console.error(e)
}


3.3 异步 API


大多数 API 都是异步 API,如 wx.request,wx.login 等。这类 API 接口通常都接受一个 Object 类型的参数,这个参数都支持按需指定以下字段来接收接口调用结果:


Object参考说明:


参数名 类型 必填 说明

success function 否 接口调用成功的回调函数

fail function 否 接口调用失败的回调函数

complete function 否 接口调用结束的回调函数(调用成功、失败都会执行)

其他 Any - 接口定义的其他参数

回调函数的参数


success,fail,complete 函数调用时会传入一个 Object 类型参数,包含以下字段:


属性 类型 说明

errMsg string 错误信息,如果调用成功返回 ${apiName}:ok

errCode number 错误码,仅部分 API 支持,具体含义请参考对应 API 文档,成功时为 0。

其他 Any 接口返回的其他数据

异步 API 的执行结果需要通过 Object 类型的参数中传入的对应回调函数获取。部分异步 API 也会有返回值,可以用来实现更丰富的功能,如 wx.request,wx.connectSocket 等。


代码示例


wx.login({
  success(res) {
    console.log(res.code)
  }
})


异步 API 返回 Promise

基础库 2.10.2 版本起,异步 API 支持 callback & promise 两种调用方式。当接口参数 Object 对象中不包含 success/fail/complete 时将默认返回 promise,否则仍按回调方式执行,无返回值。


注意事项:


部分接口如 downloadFile, request, uploadFile, connectSocket, createCamera(小游戏)本身就有返回值, 它们的 promisify 需要开发者自行封装。

当没有回调参数时,异步接口返回 promise。此时若函数调用失败进入 fail 逻辑, 会报错提示 Uncaught (in promise),开发者可通过 catch 来进行捕获。

wx.onUnhandledRejection 可以监听未处理的 Promise 拒绝事件。

代码示例:


// callback 形式调用
wx.chooseImage({
  success(res) {
    console.log('res:', res)
  }
})
// promise 形式调用
wx.chooseImage().then(res => console.log('res: ', res))


3.4 云开发 API


开通并使用微信云开发,即可使用云开发API,在小程序端直接调用服务端的云函数。


代码示例


wx.cloud.callFunction({
  // 云函数名称
  name: 'cloudFunc',
  // 传给云函数的参数
  data: {
    a: 1,
    b: 2,
  },
  success: function(res) {
    console.log(res.result) // 示例
  },
  fail: console.error
})
// 此外,云函数同样支持 promise 形式调用
落798.
目录
相关文章
杀死一只知更鸟debug
|
19天前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
杀死一只知更鸟debug
42 3
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
Codelinghu
|
4天前
|
XML 小程序 JavaScript
小程序入门之项目配置说明和数据绑定
小程序入门之项目配置说明和数据绑定
Codelinghu
18 1
杀死一只知更鸟debug
|
19天前
|
小程序 前端开发 API
微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
本文讨论了在微信小程序中调用API回调函数时无法获取到`this`上下文的问题,并提供了解决方案。在回调函数中,使用一个变量(如`that`)来保存当前的`this`引用,然后在回调内部使用这个变量来访问当前页面的数据和方法。
杀死一只知更鸟debug
24 0
路边两盏灯
|
2月前
|
前端开发 API 网络架构
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
路边两盏灯
33 1
路边两盏灯
|
2月前
|
安全 API 网络安全
【Azure API 管理】APIM如何配置客户端证书的CRL检测策略
【Azure API 管理】APIM如何配置客户端证书的CRL检测策略
路边两盏灯
31 1
路边两盏灯
|
2月前
|
Web App开发 缓存 小程序
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
路边两盏灯
36 1
路边两盏灯
|
2月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
路边两盏灯
35 0
路边两盏灯
|
2月前
|
API
【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
路边两盏灯
33 0
路边两盏灯
|
2月前
|
前端开发 API
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
路边两盏灯
14 0
我是苏云曦吖
|
2月前
|
应用服务中间件 Linux API
Linux 利用 Cloudflare API 配置 acme.sh 自动续签 SSL (Apache、Nginx适用)
安装acme.sh工具,命令为`curl https://get.acme.sh | sh -s email=你的邮箱`。接着配置Cloudflare API,创建并记录API令牌及Zone ID。最后通过`acme.sh --issue -d 你的域名 --dns dns_cf`签发SSL证书,对于Nginx可使用`acme.sh --install-cert`命令安装证书,并设置自动重载Nginx服务。
我是苏云曦吖
140 0

热门文章

最新文章

  • 1
    TensorFlow中的那些高级API
  • 2
    5分钟构建API接口服务 | python小知识
  • 3
    一个免费功能强大的谷歌翻译api
  • 4
    View and Data API Tips: Hide elements in viewer completely
  • 5
    .Net程序员安卓学习之路2:访问网络API
  • 6
    17、Windows API 图形用户界面(1)
  • 7
    Python利用Django 构建Rest Api: 快速入门教程
  • 8
    FTK应用程序编程接口(API)手册-1【转】
  • 9
    NODE-WEBKIT教程(6)NATIVE UI API 之MENU(菜单)
  • 10
    iOS5系统API和5个开源库的JSON解析速度测试
  • 1
    企业微信应用结合Cpolar内网穿透实现固定域名验证回调本地接口服务
    156
  • 2
    微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门(二)
    464
  • 3
    微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门(一)
    234
  • 4
    轻松学会微信小程序开发(一)
    203
  • 5
    使用阿里云短信+微信短链接跳转微信小程序
    400
  • 6
    微信小程序开发1
    129
  • 7
    【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
    120
  • 8
    【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
    241
  • 9
    【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
    212
  • 10
    【Python+微信】【企业微信开发入坑指北】1. 数据链路打通:接收用户消息处理并回复
    89
  • 相关课程

    更多
  • IoT小程序框架课程
  • C++ 入门教程开发文档
  • Cloud Toolkit 开发部署效率提升神器
  • 前端开发框架Bootstrap使用教程
  • 相关电子书

    更多
  • 《使用Serverless服务快速开发小程序》
  • 《云市场-小程序》
  • 数字乡村建设方案
  • 相关实验场景

    更多
  • 基于小程序Serverless开发个人相册小程序
  • 基于函数计算快速搭建Wordpress博客系统
  • 基于 IntelliJ IDEA 插件部署微服务应用
  • 零基础入门Serverless:一键部署红白机小游戏
  • 基于函数计算快速搭建Zblog等传统应用框架
  • 搭建IoT小程序开发环境,创建一个应用
  • 下一篇
    阿里云OSS设置跨域访问

    深圳坪山网站建设公司奉化最火百度网站优化登封网站优化推广哪家好上城区网站优化排名濮阳企业网站优化推广有哪些连云港网站搜索优化公司鄢陵优化网站推广效果如何佛山网站排名优化外包公司四川标准网站优化价目梁山外贸网站优化西安企业优化网站广渠门网站优化清溪网站关键词优化多少钱安顺营销型网站优化平台宁波网站关键字优化公司referer对网站的优化网站频道优化潞城关键词网站优化洛阳整站网站优化系统优化网站建设公司地址珠海网站优化报价广平县网站优化公司360优化网站买网站做优化可以吗昆明网站seo优化服务温州网站优化解决方案产品网站优化宁波环保网站优化郫都区优化网站优化网站没排名了伊春网站推广优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

    深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化