Хранилище с открытым исходным кодом Xinbee Mall (открытый исходный код торгового центра H5, содержащий Vue 2.x и Vue 3.x, с интерфейсом API на стороне сервера):github.com/newbee-ltd
Vue 3.x + Vant 3.x + Vue-Router 4.x Высокая имитация учетной записи WeChat с открытым исходным кодом (с API-интерфейсом сервера):GitHub.com/Nick930826/…
Адрес источника этой статьи:GitHub.com/Nick930826/…
предисловие
Недавно компания собирается сделать небольшой проект, я спросил у босса, может ли он им воспользоваться.Vue
Напишите, потому что компания используетReact
, в основном хочу попробоватьVite
.Vite
Это опять от деда, так что хочу попробоватьVue
как технологический стек. Начальник спросил меня: «Ты дерьмо ешь?» Я смутно чувствовал, что начальник ругает предков, но опровергнуть этого не мог, поэтому попытался использоватьVite
+ React
Форма целой проектной полки.
Здесь все установлено по умолчанию.Node
окружающая обстановка.
Точка знаний
-
Vite
инициализацияReact
проект - плагин импорта маршрутизации
react-router-dom
- вводить
Ant Design
Библиотека компонентов - настроить
Ant Design
Импорт по требованию - настроить
Ant Design
Цвет темы - Настройка переменных среды времени пакета и времени выполнения
env
-
axios
Вторичная упаковка - Путь к пакету статических ресурсов
-
Vite
Некоторые конфигурации , такие как порт разработки,proxy
играет роль,alias
псевдоним и т. д.
Начало
Инициализировать проект Vite + React
Я должен чувствовать здесь, это было еще год назадVite 1.x
, через год становится2.x
. Объясните две проблемы, дедушка очень положительно относится к этому проекту, и есть много неясных факторов. Но это не мешает нам его изучить, ведь это действительно вкусно и быстро. положи этоОфициальная китайская документация, вы можете посмотреть документацию, если вам интересно.
Vite
Официальный предоставляет два способа инициализации проекта, один из них:
npm init @vitejs/app
Конфигурация может быть выбрана свободно. Другой способ — напрямую использовать официально предоставленный шаблон, чтобы сгенерировать его одним щелчком мыши:
# npm 6.x
npm init @vitejs/app vite-react-app --template react
# npm 7+, 需要额外的双横线:
npm init @vitejs/app vite-react-app -- --template react
Этот учебник принимает вторую форму и генерирует проект следующим образом:
Следуйте инструкциям выше, чтобы войтиvite-react-app
, после установки пакета запускаем проект:
На данный момент вы успешно построилиVite
+ React
среда разработки. 🎉 🎉 🎉
Представляем плагин маршрутизации react-router-dom
Предпочтительная установкаreact-router-dom
, команда выглядит следующим образом:
npm i react-router-dom -S
в проектеsrc
Добавить в каталогcontainer
Каталог используется для размещения компонентов страницы, а затем вcontainer
Два новых каталога добавлены вIndex
иAbout
, добавьте следующее:
// Index/index.jsx
import React from 'react'
export default function Index() {
return <div>
Index
</div>
}
// About/index.jsx
import React from 'react'
export default function About() {
return <div>
About
</div>
}
Создать новыйsrc/router/index.js
Настройте массив маршрутизации и добавьте следующее:
// router/index.js
import Index from '../container/Index'
import About from '../container/About'
const routes = [
{
path: "/",
component: Index
},
{
path: "/about",
component: About
}
];
export default routes
существуетApp.jsx
Импортируйте конфигурацию маршрутизации, чтобы переключить пути браузера и отобразить соответствующие компоненты:
// App.jsx
import React, { useState } from 'react'
import {
BrowserRouter as Router,
Switch,
Route
} from "react-router-dom"
import routes from '../src/router'
function App() {
return <Router>
<Switch>
{
routes.map(route => <Route exact key={route.path} path={route.path}>
<route.component />
</Route>)
}
</Switch>
</Router>
}
export default App
Стартовый проектnpm run dev
,Как показано ниже:
Представляем библиотеку компонентов пользовательского интерфейса Ant Design
Ant Design
Официальный сайт не даетVite
Метод конфигурации , вот мое собственное исследование. Сначала скачиваем установочный пакет:
npm i antd @ant-design/icons -S
В настоящее время последняя версия пакета значков находится отдельно, поэтому, кстати, также установлен @ant-design/icons.
После успешной установки мы сначала проверяем, можно ли ее успешно запустить с помощью метода глобального внедрения. Открытымmain.jsx
Добавить стиль:
...
import 'antd/dist/antd.css'
...
назад сноваIndex/index.jsx
изменить, как показано ниже:
import React from 'react'
import { Button } from 'antd'
export default function Index() {
return <div>
<Button type='primary'>Index</Button>
</div>
}
Перезапустите проект, браузер выглядит следующим образом, представляя введениеAnt Design
успех:
На этом этапе мы можем попытаться выполнить некоторые оптимизации.Давайте сначала посмотрим, насколько велики статические ресурсы после завершения пакета. Команда Runnpm run build
,Следующее:
На первый взгляд, форма глобального внедрения стилей, непосредственно завершающая упаковку,css
статические ресурсы587.96k
, давай попробуем按需加载
стиль.
Сначала устанавливаем плагин:
npm i vite-plugin-imp -D
затем вvite.config.js
Добавьте в файл конфигурации следующее:
import { defineConfig } from 'vite'
import reactRefresh from '@vitejs/plugin-react-refresh'
import vitePluginImp from 'vite-plugin-imp'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
reactRefresh(),
vitePluginImp({
libList: [
{
libName: "antd",
style: (name) => `antd/lib/${name}/style/index.less`,
},
],
})
],
css: {
preprocessorOptions: {
less: {
// 支持内联 JavaScript
javascriptEnabled: true,
}
}
},
})
переустановитьless
пакет плагинов,npm i less -D
, так как приведенная выше конфигурация, которую мы используемless
, и нам нужно настроитьjavascriptEnabled
заtrue
,служба поддержкиless
в линиюJS
.
Здесь мы будемmain.jsx
изimport 'antd/dist/antd.css'
Удалить и начать зановоnpm run dev
, вы обнаружите, что стили импортируются по мере необходимости. Посмотрим на плагиныvite-plugin-imp
Что сделал:
ооо, вотindex.jsx
Компонент стиля кнопки представлен отдельно в . Давайте посмотрим на размер упакованного статического ресурса:
css
Пакет стилей сразу становится40.29kb
, так приятно пахнет~~
Некоторые учащиеся могут беспокоиться о том, что если компонент «Кнопка» будет представлен на разных страницах, стили будут вводиться повторно. Ответ — нет, при упаковке и сборке похожие элементы будут объединены, поэтому в итоге файл стиля кнопки будет представлен только один раз.
Пользовательский цвет темы Ant Design
Во время разработки набор стилей темы будет настроен в соответствии с потребностями проекта и дизайном дизайнера (рисованием), включая такие правила, как поля, размер текста, цвет границы и так далее. наверное использовали раньшеwebpack
Одноклассники в том наборе умеют играть, но теперь используютVite
, нам нужно сделать следующее.
первый открытыйvite.config.js
, добавьте следующий код:
...
import path from 'path'
import fs from 'fs'
import lessToJS from 'less-vars-to-js'
const themeVariables = lessToJS(
fs.readFileSync(path.resolve(__dirname, './config/variables.less'), 'utf8')
)
...
css: {
preprocessorOptions: {
less: {
// 支持内联 JavaScript
javascriptEnabled: true,
// 重写 less 变量,定制样式
modifyVars: themeVariables
}
}
}
...
less-vars-to-js
будетless
стиль, преобразованный вjson
В виде пар ключ-значение, конечно, можно и напрямуюmodifyVars
писать после атрибутаjson
пара ключ-значение.
Затем создайте новый в корневом каталогеconfig
каталог, добавитьvariables.less
Содержание следующее:
// 自定义覆盖 =============================================================
@primary-color: green; // 全局主色
// 下面你可以各种写一些覆盖的样式,这里就简单覆盖一个主题色的样式,我们改为绿色
Повторите следующее:
Это изменит цвет темы.
Как получить переменные окружения
Я много искал, но на данный моментVite
Экология, до сих пор не могу найти нужный мне ответ, я связываю последнюю надежду сVite
складissue, действительно нашел что-то. Вот небольшое отступление: если есть какие-либо проблемы, пожалуйста, сначала решите их самостоятельно, а затем перейдите на соответствующий склад, чтобы узнать, есть ли аналогичные проблемы, которые были решены. Не ходите в группу спрашивать у начальства на каждом шагу, начальство не занято, я решу проблему за вас бесплатно?
Хорошо, давайте повернем компасы вперед. Когда мы обычно разрабатываем проекты, в основном есть три среды: среда разработки, тестовая среда и формальная среда.Эти три среды должны настроить три разных ресурса, таких как изображения, адреса интерфейсов, скрытые точки, статистика Baidu и так далее.
при упаковкеИтак, как мы упаковываем, вvite.config.js
получить переменные среды в нем?
Сначала мы модифицируемpackage.json
изscripts
свойства следующим образом:
scripts: {
"dev": "vite --mode development",
"build:beta": "vite build --mode beta",
"build:release": "vite build --mode release",
"serve": "vite preview"
}
--mode
Последний представляет собой значение переменной окружения, соответствующей каждому окружению, почему оно должно использоваться здесь?--mode
Шерстяная ткань? Официально значение этой переменной можно получить на странице позже.
мы вvite.config.js
печатает так:
console.log('process:::env', process.argv)
повторный запускnpm run dev
Следующее:
Последний параметр — это устанавливаемая нами переменная среды. Таким образом, мы можем получить переменные среды следующим образом:
const env = process.argv[process.argv.length - 1]
мы можемvite.config.js
конфигурацияindex.html
Внутри префикс пути для статических ресурсов. Изменения заключаются в следующем:
...
const env = process.argv[process.argv.length - 1]
const base = config[env]
...
export default defineConfig({
base: base.cdn
})
в корневом каталогеconfig
каталог, добавитьindex.js
файл, добавьте следующее:
export default {
development: {
cdn: './',
apiBaseUrl: '/api' // 开发环境接口请求,后用于 proxy 代理配置
},
beta: {
cdn: '//s.xxx.com/vite-react-app/beta', // 测试环境 cdn 路径
apiBaseUrl: '//www.beta.xxx.com/v1' // 测试环境接口地址
},
release: {
cdn: '//s.xxx.com/vite-react-app/release', // 正式环境 cdn 路径
apiBaseUrl: '//www.xxx.com/v1' // 正式环境接口地址
}
}
Попробуем сделать тестовый пакет и выполнить следующую команду:
npm run build:beta
Результат выглядит следующим образом:То же самое можно сказать и о формальной среде.
Время выполненияТак как же нам получить соответствующие переменные среды при запуске кода? ответimport.meta.env
. мы вIndex/index.jsx
Распечатайте, чтобы знать:
import React from 'react'
import { Button } from 'antd'
export default function Index() {
console.log('import.meta.env', import.meta.env)
return <div>
<Button type='primary'>Index</Button>
</div>
}
Возвращается объект, и в объекте находятся соответствующие параметры, здесь нам нужноMODE
Параметр, соответствующий атрибуту, — это текущая переменная среды, которую мы хотим.
Аксиомы вторичной упаковки
При разработке проекта сервер предоставит нам тестовый интерфейс и формальный интерфейс, здесь нам нужно настроить соответствующие переменные для динамического получения адреса запроса.
Сначала мы устанавливаемaxios
иqs
:
npm i axios qs -S
затем вsrc
новый каталогutils
Каталог, предназначенный для хранения различных инструментов и методов. существуетutils
новый подindex.js
, добавьте следующий код:
import axios from 'axios'
import { message } from 'antd'
import { stringify } from 'qs'
import config from '../../config'
const MODE = import.meta.env.MODE // 环境变量
const getRequest = (method) => {
return (url, data, options = {}) => {
let base = config[MODE] // 获取环境变量相对应的属性值
return axios({
baseURL: base.apiBaseUrl, // 请求域名地址
method,
url,
...(method === 'POST'
? {
data: options.string ? stringify(data) : data,
}
: {}),
params: method === 'GET' ? data : options.params,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': options.string
? 'application/x-www-form-urlencoded'
: 'application/json',
...options.headers,
},
withCredentials: true,
})
.then((res) => {
if (typeof res.data !== 'object') {
console.error('数据格式响应错误:', res.data)
message.error('前方拥挤,请刷新再试')
return Promise.reject(res)
}
if (res.data.errcode) {
if (res.data.errcode == 401) {
window.location.href = 'login' // 登录失效跳转登录页
return
}
// silent 选项,错误不提示
if (res.data.message && !options.silent)
message.error(res.data.message)
return Promise.reject(res.data)
}
return res.data
})
.catch((err) => {
message.error('系统错误', 2)
return Promise.reject(err)
})
}
}
export const get = getRequest('GET')
export const post = getRequest('POST')
здесь черезconfig[MODE]
Получите значения атрибутов, соответствующие разработке, тестированию и официальному, чтобы получитьapiBaseUrl
Переменная.
Кстати, так же добавляем прокси запроса среды разработки, открываемvite.config.js
, добавьте следующие свойства:
...
export default defineConfig({
...
server: {
port: 3001, // 开发环境启动的端口
proxy: {
'/api': {
// 当遇到 /api 路径时,将其转换成 target 的值,这里我们为了测试,写了新蜂商城的请求地址
target: 'http://47.99.134.126:28019/api/v1',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '') // 将 /api 重写为空
}
}
}
})
Чтобы проверить, успешен ли запрос интерфейса, мы находимся вIndex/index.jsx
Добавьте внутрь следующий код:
import React, { useEffect } from 'react'
import { Button } from 'antd'
import { get } from '../../utils'
export default function Index() {
useEffect(() => {
get('/index-infos').then(() => {
})
}, [])
return <div>
<Button type='primary'>Index</Button>
</div>
}
Перезапустите проект, и результат будет выглядеть так:
Настройки псевдонима resolve.alias
Подобно большинству элементов конфигурации, конфигурация псевдонимов такжеvite.config.js
, мы открываем его и добавляем следующий код:
export default defineConfig({
...
resolve: {
alias: {
'~': path.resolve(__dirname, './'), // 根路径
'@': path.resolve(__dirname, 'src') // src 路径
}
}
...
})
После настройки мы перепишем некоторые пути в приведенном выше коде следующим образом:
// router/index.js
import Index from '@/container/Index'
import About from '@/container/About'
// utils/index.js
import config from '~/config'
// App.jsx
import routes from '@/router'
Это удобно и кратко, в дальнейшем мы можем продолжить добавлять некоторые пути и сокращать количество слов для повышения эффективности разработки.
Суммировать
Эта статья заканчивается здесь. Какие? ты все еще хочешьTS
,CSS Module
,Eslint
, не создавайте проблем, идите на склад, чтобы загрузить код, и играйте медленно, меня вырвало, пожалуйста, похвалите его, милый брат ~~~. Наберу 500 лайков, напишу еще одинVite
+ Vue
+ element-plus
из. йо Йо
Рекомендуемые статьи в прошлом
Если у вас нет собеседования, вы должны понимать прототип и цепочку прототипов.Лайков 👍 495
Vue 3 и Webpack 5 здесь, знания о ручной сборке должны быть обновленыЛайков 👍 479
Анализ под другим углом, оптимизация производительности веб-страницыЛайков 👍 173
Здравствуйте, расскажите о своем понимании внешней маршрутизации.Лайков 👍 565
Раньше у меня не было выбора, теперь я просто хочу использовать Array.prototype.reduceЛайков 👍 554
Вездесущая модель публикации-подписки — на этот раз точноЛайков 👍 554
Расскажите о JSX и виртуальном DOM.Лайков 👍 83