задний план
В последнее время команда пилотирует использованиеuni-app
Чтобы выполнить некоторые небольшие требования, но в основном сначала сделать пилотную версию на H5, а затем скомпилировать ее в небольшую программу для выпуска, как и планировалось. На этот раз я поделюсь несколькими небольшими проблемами и решениями, с которыми столкнулись.
Упомянутые ниже проблемы в основном используются вuni-app
развиватьH5
Он будет встречаться только тогда, когда платформа неH5
Платформу можно игнорировать.
междоменная проблема
Во-первых, локальная разработка отличается от разработки напрямую с помощью IDE для небольших программ.H5
При использовании платформы вам нужно использовать браузер для отладки, и у браузера будут междоменные проблемы. Например, когда вы напрямую обращаетесь к разрабатываемой странице через локальный IP-адрес, и эта страница будет вызывать некоторые существующие интерфейсы, она столкнется с междоменными проблемами.
официальное решение
uni-app
Чиновник представил некоторые методы решения междоменных проблем, такие как включение CORS на сервере, установка междоменных плагинов для браузеров и т. д. Подробнее см.Меры предосторожности при использовании версии uni-app H5. Но что в нем не упоминается (должно быть вызвано тем, что документ долго не обновлялся), так это то, что если вы не хотите проходить через такую нервотрепку, чтобы решить ее, есть более удобный способ, а именно использоватьwebpack-dev-serverПойдите к агенту, чтобы решить это.
более удобное решение
Согласно описанию официальной документации,devServer
требуется настройка вmanifest.json
перейти к конфигурации, и поскольку этот файл конфигурацииjson
формат, поэтому можно настроить только простые типы. но дляproxy
Этой конфигурации также достаточно. Это можно решить напрямую, настроив следующим образом:
// manifest.json
{
"h5": {
"devServer": {
"proxy": {
"/prefix/api/user/list": {
"target": "https://api-remote.xxxx.com",
"pathRewrite": {
"^/prefix": ""
}
}
}
}
}
}
другое решение
Создайте файл vue.config.js напрямую, настройте в нем devServer и поместите код напрямую
// vue.config.js
module.exports = {
devServer: {
proxy: {
'/prefix/api/user/list': {
target: 'https://api-remote.xxxx.com',
pathRewrite: {
'^/prefix': ''
}
}
},
}
}
Преимущества такого подхода очевидны, т.js
вместоjson
Деконфигурация будет более гибкой.Следует отметить, что две вышеуказанные схемы нельзя использовать одновременно, и первая будет охватывать вторую.
проблема мока
Это может не иметь большого значения, в конце концов, есть много онлайн-платформ для насмешек, таких как Easy Mock. Но иногда это может показаться хлопотным, если вы не хотите выходить из окна редактирования кода для регистрации, записываете фиктивные данные онлайн и хотите решить все с помощью кода, тогда мы также можем использовать второе решение выше, чтобы сделать это.
решение
с помощьюmocker-api
иmockjs
Эти два инструмента, прямая настройкаdevServer
изbefore
вариантов, код выглядит следующим образом:
// vue.config.js
const webpackApiMocker = require('mocker-api')
module.exports = {
devServer: {
before (app) {
webpackApiMocker(app, path.resolve('./mock/index.js'))
}
}
}
// mock/index.js
const Mock = require('mockjs')
const Random = Mock.Random
const mock = Mock.mock
const proxy = {
'GET /api/user/list': mock({
'array|3': [
{
id: 1,
username: 'kenny',
sex: 'male'
}
]
}),
'POST /api/login/account': (req, res) => {
return res.json({
status: 'ok',
data: {
id: Random.id(),
userName: Random.cname(),
city: Random.city()
}
})
}
}
module.exports = proxy
Проблемы с публичным путем
На этапе тестирования нам нужно развернуть код в CDN для тестирования.Разные среды соответствуют разным доменным именам CDN.manifest.json
Мы надеемся, что способ настройки publicPath, очевидно, очень негибкий.publicPath
Он динамичен, связан со средой, репозиторием, названием проекта и даже веткой разработки и не требует от разработчиков заботы.
решение
Для решения этой проблемы требуется небольшая доработка строительных лесов.
- Во-первых, мы будем
publicPath
Эта конфигурация вынесена и помещена в отдельный конфигурационный файл, напримерproject-config.js
, и поместите его в корневой каталог проекта
const projectName = 'xxx' // 当前工程名,此处自由发挥即可
const isDev = isDev() // 是否为本地开发环境,此处自由发挥即可
const CDN_HOST = process.env.CDN_HOST // build时指定的CDN域名
const APP_ENV = process.env.APP_ENV // build时指定的自定义环境
module.exports = {
publicPath: isDev
? '/'
: `//${CDN_HOST}/static/${projectName}/${APP_ENV}/`,
}
- Во-вторых, мы разветвили версию официального исходного кода универсального приложения и
@dcloudio/vue-cli-plugin-uni/index.js
внес некоторые изменения
// @dcloudio/vue-cli-plugin-uni/index.js#L30
// 获取本地的project-config配置
module.exports = (api, options) => {
const projectConfig = require(api.resolve('project-config'))
Object.assign(options, {
outputDir: process.env.UNI_OUTPUT_TMP_DIR || process.env.UNI_OUTPUT_DIR,
assetsDir
}, vueConfig, {
// 重新对publicPath进行覆盖
publicPath: process.env.NODE_ENV === 'production' ? projectConfig.publicPath : '/'
})
}
Это сделаетmanifest.json
Конфигурация недействительна, то есть если вы используетеHBuilder
Развитие будет затронуто немного.