vue-cli4 многостраничный
multipage
адрес гитхаба GitHub.com/Qin Europe/Му плодородные поля…
Создайте каркас многостраничного шаблона на основе vue-cli4.0!
Стартовый проект
git clone https://github.com/qinouz/multipage.git
cd multipage
npm install
npm run dev
содержание
- √ Vue-cli4
- √ Создание многостраничной конфигурации на основе структуры каталогов
- √ Настройка нескольких переменных среды
- √ rem адаптационное решение
- √ Управление состоянием Vuex
- √ Vue-маршрутизатор
- √ Настроить псевдоним псевдоним
- √ Настроить междоменный прокси
- √ Анализ упаковки конфигурации
✅ Создать многостраничную конфигурацию
build/newUtils.jsвнутреннийgetEntryМетод Создайте путь к странице и соответствующий html-объект в соответствии со всеми html-файлами в каталоге.
var pages = utils.getEntry(['./src/module/**/*.html']);
Возвращаемый результат:
{ 'aa/as/dd/fd/ddd': './src/module/aa/as/dd/fd/ddd/ddd.html',
'aa/ddd': './src/module/aa/ddd/ddd.html',
'ss': './src/module/ss/ss.html'
}
getEntryPagesметодvar mpages = utils.getEntryPages(pages);Чтобы создать окончательную многостраничную конфигурацию, структура каталогов должна соответствовать определенным правилам.
Имя папки должно совпадать с именем основного файла и именем файла шаблона html, а иерархическая структура не ограничена.
├── module
│ └── ss
| | └── ss.html
| | └── ss.js
Возвращаемый результат:
{ 'aa/as/dd/fd/ddd':{ entry: './src/module/aa/as/dd/fd/ddd/ddd.js',
template: './src/module/aa/as/dd/fd/ddd/ddd.html' },
'aa/ddd':{ entry: './src/module/aa/ddd/ddd.js',
template: './src/module/aa/ddd/ddd.html' },
ss:{ entry: './src/module/ss/ss.js',
template: './src/module/ss/ss.html' } }
✅ Настройка нескольких переменных среды
package.jsonвнутреннийscriptsнастроитьdev qa prd,пройти через--mode xxxвыполнять в различных средах
- пройти через
npm run devзапустить локально, выполнитьdevelopment - пройти через
npm run qaпакетный тест, выполнитьstaging - пройти через
npm run prdОфициально упаковано, выполненоproduction
"scripts": {
"dev": "vue-cli-service serve --open",
"stage": "vue-cli-service build --mode staging",
"build": "vue-cli-service build",
}
Введение в конфигурацию
кVUE_APP_Переменные в начале кода можно передавать в кодprocess.env.VUE_APP_доступ.
Например,VUE_APP_ENV = 'development'пройти черезprocess.env.VUE_APP_ENVдоступ.
КромеVUE_APP_*В дополнение к переменным есть две специальные переменные, которые всегда доступны в коде вашего приложения.NODE_ENVа такжеBASE_URL
Создайте новый проект в корневом каталоге проекта.env.*
- .env конфигурация локальной среды разработки
NODE_ENV = development
VUE_APP_SERVICE_URL =
BASE_URL = ./
- .env.qa конфигурация тестовой среды
NODE_ENV = production
VUE_APP_SERVICE_URL = http://www.baidu.com
BASE_URL = /shopsystem/static/weixin/dist/
- .env.prd официальная конфигурация среды
NODE_ENV = production
VUE_APP_SERVICE_URL = http://www.baidu.com
BASE_URL = /shopsystem/static/weixin/dist/
Настройте переменные, соответствующие среде, и возьмите локальный файл среды..envНапример, пользователи могут изменять в соответствии со своими потребностями.
// 本地环境配置
NODE_ENV = development
VUE_APP_SERVICE_URL =
VUE_APP_TEST=test
BASE_URL = ./
В зависимости от окружения переменные будут разными
// 根据环境不同引入不同baseApi地址
const instance = axios.create();
var path = process.env.VUE_APP_SERVICE_URL;
instance.defaults.baseURL = path;
✅ план адаптации рем
Не волнуйтесь, проект уже настроенremАдаптация, нижеследующее является только введением:
Стили в Ванте используются по умолчаниюpxВ качестве единицы, если вам нужно использоватьremединиц, рекомендуются следующие два инструмента:
-
postcss-pxtoremэто
postcssПлагин для преобразования единиц вrem -
lib-flexibleдля установки
remИсходная величина
Конфигурация PostCSS
Ниже приведены основныеpostcssКонфигурация, которая может быть изменена на основе этой конфигурации в соответствии с требованиями проекта
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
plugins: {
postcss: {
plugins: [
require('postcss-pxtorem')({
rootValue: 37.5, // 换算的基数
selectorBlackList: [], // 忽略转换正则匹配项
propList: ['*'],
}),
]
}
}
}
Родительский компонент изменяет стиль дочернего компонента Глубокий селектор
когда ваш дочерний компонент используетscopedНо если вы хотите изменить стиль дочернего компонента в родительском компоненте, вы можете передать>>>реализовать:
<style scoped>
.a >>> .b { /* ... */ }
.a {
/deep/ .b {
...
}
}
</style>
✅ Управление состоянием Vuex
Структура каталогов
├── store
│ ├── modules
│ │ └── app.js
│ ├── index.js
│ ├── getters.js
main.jsпредставлять
import Vue from 'vue'
import App from './App.vue'
import store from './store'
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})
использовать
<script>
import {mapGetters} from 'vuex'
export default {
computed: {
...mapGetters(['userName'])
},
methods: {
// Action 通过 store.dispatch 方法触发
doDispatch() {
this.$store.dispatch('setUserName', '真乖,赶紧关注公众号,组织都在等你~')
}
}
}
</script>
✅ Vue-роутер
Этот случай принимаетhashМодель, разработчики модифицированы по требованиюmode base
Уведомление: если вы использовалиhistoryмодель,vue.config.jsсерединаpublicPathсделать соответствующиеИсправлять
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export const router = [
{
path: '/',
name: 'index',
component: () => import('@/views/home/index'), // 路由懒加载
meta: {
title: '首页', // 页面标题
keepAlive: false // keep-alive 标识
}
}
]
const createRouter = () =>
new Router({
// mode: 'history', // 如果你是 history模式 需要配置 vue.config.js publicPath
// base: '/app/',
scrollBehavior: () => ({y: 0}),
routes: router
})
export default createRouter()
Более:Vue Router
✅ Настроить псевдоним псевдонима
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
module.exports = {
chainWebpack: config => {
// 添加别名
config.resolve.alias
.set('@', resolve('src'))
.set('assets', resolve('src/assets'))
}
}
✅ Настроить междоменный прокси
Если для вашего проекта требуются междоменные настройки, вам нужно позвонитьvue.config.js proxyПрокомментируйте и настройте соответствующие параметры
module.exports = {
devServer: {
// ....
proxy: {
//配置跨域
'/api': {
target: 'https://test.xxx.com', // 接口的域名
// ws: true, // 是否启用websockets
changOrigin: true, // 开启代理,在本地创建一个虚拟服务端
pathRewrite: {
'^/api': '/'
}
}
}
}
}
✅ Анализ упаковки конфигурации
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
module.exports = {
chainWebpack: config => {
// 打包分析
if (IS_PROD) {
config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
{
analyzerMode: 'static'
}
])
}
}
}