Раздел 1: Обзор nuxt.js
Nuxt.js — это просто общая структура для Vue.js, наиболее часто используемая для SSR (рендеринга на стороне сервера). Vue.js используется для разработки SPA (одностраничных приложений). Nuxt.js — это разработанная среда с Vue.Для многостраничных приложений и рендеринга на стороне сервера вы можете напрямую использовать команды для создания проекта Vue, который мы превратили в статический html.
1. Каковы преимущества рендеринга на стороне сервера?
Основная причина в том, что SPA (одностраничное приложение) не способствует SEO-работе поисковых систем, Nuxt.js подходит для таких проектов, как новости, блоги, фильмы и консультации, которым нужен трафик, предоставляемый поисковыми системами. Если вы работаете над мобильным проектом, нет необходимости использовать этот фреймворк.
2. Что такое ССР?
знаяSSR
раньше, первыйCSR
а такжеSSR
Проведите сравнение между ними.
Давайте сначала рассмотрим традиционную веб-разработку.Традиционная веб-разработка заключается в том, что клиент отправляет запрос на сервер, сервер запрашивает базу данных и сшивает вместе.HTML
Строка (шаблон), после серии обработки данных отсортированныйHTML
Возврат к клиенту браузера эквивалентен открытию страницы. Такие, как мы часто слышимjsp
,PHP
,aspx
это традиционноMVC
разработка.
SPA
приложение, здесьVue
,React
, отличный пользовательский интерфейс одностраничных приложений постепенно стал основным, и страница интегрирована.javaScript
Рендеринг, называемый рендерингом на стороне клиентаCSR
.SPA
процесс рендеринга.由客户端访问URL
Отправить запрос на сервер и вернутьHTML
структура (ноSPA
возвращенныйHTML
Структура очень маленькая, есть только одна базовая структура, как показано в первом коде). После того, как клиент получает возвращенный результат, он начинает рендеринг на клиенте.HTML
, соответствующее выполнение выполняется при рендерингеjavaScript
, окончательный рендерtemplate
, после завершения рендеринга снова отправьте запрос данных на сервер, обратите внимание на запрос данных здесь, сервер возвращаетjson
форматировать данные. Клиент получает данные, а затем завершает окончательный рендеринг.
SPA
Хотя это снижает нагрузку на сервер, у него есть и недостатки:
- Время рендеринга первого экрана относительно велико: приходится ждать
JavaScript
После завершения загрузки и завершения выполнения можно отобразить первый экран. -
SEO
Недружественный: поисковые роботы могут получить только одинdiv
элемент, считает страницу пустой, не способствуетSEO
.
Для решения двух вышеуказанных проблем необходимоSSR
Решение, бэкэнд рендерит первый экранDOM
Структура возвращается, внешний интерфейс получает содержимое и выводит его на первый экран, а последующие операции со страницами затем маршрутизируются и отображаются с одной страницей, что называется рендерингом на стороне сервера (SSR
).
SSR
Процесс рендеринга такой, клиент отправляетURL
Запрос к серверу, сервер читает соответствующийurl
информация о шаблоне, сделанная на стороне сервераhtml
а также数据
Рендеринг, возврат после завершения рендерингаhtml
структура, первая экранная страница после того, как клиент получит ее в это времяhtml
структура. Таким образом, пользователь будет очень быстрым при просмотре первого экрана, потому что клиенту не нужно отправлять его снова.ajax
просить. не выполненоSSR
Наши страницы не принадлежатSPA
применяется, это все еще автономныйspa
заявление.
SSR
вCSR
а такжеSPA
Компромиссное решение между приложениями, рендеринг выполняется на стороне сервера при рендеринге первого экрана.Обратите внимание, что это только первый экран, остальные страницы все равно нужно рендерить на стороне клиента.服务端
После получения запроса и рендеринга первой экранной страницы она будет содержать оставшуюся маршрутную информацию, зарезервированную для客户端
Для отображения страниц других маршрутов.
Nuxt.js — это особенности (преимущества):
- на основе
Vue
- Автоматическое наслоение кода
- рендеринг на стороне сервера
- Мощная функция маршрутизации, поддержка асинхронных данных
- подача статических файлов
-
EcmaScript6
а такжеEcmaScript7
Синтаксис поддержки - Упаковать и сжать
JavaScript
а такжеCss
-
HTML
управление тегами заголовков - Локальная разработка поддерживает горячую загрузку
- интегрированный
ESLint
- Поддерживает различные стили прекомпиляторов
SASS
,LESS
так далее - служба поддержки
HTTP/2
толкать
Раздел 2: Создание среды Nuxt
1. Установка Nuxt.js
Перед использованием npm вам необходимо установить Node в вашей системе. Если не установлено, перейдите по этой ссылкеБлог Woo Woo.cn на.com/Zhou Yu2017/…
(1) Используйте npm для установки фреймворка vue-cli.
npm install vue-cli -g
После завершения установки вы можете использовать vue -V, чтобы проверить, прошла ли установка успешно. (Примечание: используйте здесь букву V в верхнем регистре, нижний регистр недействителен).
(2) Используйте vue для установки nuxt
После установки vue-cli вы можете использовать команду init для инициализации проекта Nuxt.js.
vue init nuxt/starter
В это время он скачает шаблон на github, а затем спросит у вас, как называется проект, кто его автор и т. д. Их можно заполнить в соответствии с вашими предпочтениями.
(3) Используйте npm install для установки пакетов зависимостей.
npm install
Этот процесс займет некоторое время. Если вам не удастся установить этот процесс, вы можете напрямую удалить папку node_modules в проекте, а затем повторно установить npm, чтобы установить его.
(4) Используйте npm run dev для запуска службы.
(5) Введите localhost:3000 в браузере, вы увидите результат следующим образом:
2. Первая установка приложения Nuxt
npm i create-nuxt-app -g
create-nuxt-app my-nuxt-demo
cd my-nuxt-demo
npm run dev
инструкция по установке:
Project name // 项目名称
Project description // 项目描述
Use a custom server framework // 选择服务器框架
Choose features to install // 选择安装的特性
Use a custom UI framework // 选择UI框架
Use a custom test framework // 测试框架
Choose rendering mode // 渲染模式
Universal // 渲染所有连接页面
Single Page App // 只渲染当前页面
3. Следующий процесс рендеринга
Полный запрос сервера к процессу рендеринга
Из приведенной выше блок-схемы видно, что когда клиент запрашивает вход, сервер имеетnuxtServerInit
Эта команда выполняется вStore
изaction
, когда сюда поступает запрос клиента, некоторая информация о клиенте может быть сохранена вStore
Другими словами, некоторая информация для входа в систему некоторых клиентов, хранящаяся на сервере, может храниться вStore
середина. используется после中间件
Механизм, промежуточное ПО - это по сути функция, которая будет выполняться перед выполнением каждого маршрута, здесь можно много чего сделать, а можно понимать как роль перехватчика роутера. после этогоvalidate
При выполнении проверяются параметры, передаваемые клиентом.asyncData
а такжеfetch
Войдите в официальный цикл рендеринга,asyncData
Получить данные с сервера и объединить запрошенные данные вVue
серединаdata
середина,
Раздел 3: Структура каталогов Nuxt
# Введение в структуру каталогов
└─my-nuxt-demo
├─.nuxt // Nuxt自动生成,临时的用于编辑的文件,build
├─assets // 用于组织未编译的静态资源如LESS、SASS或JavaScript,对于不需要通过 Webpack 处理的静态资源文件,可以放置在 static 目录中
├─components // 用于自己编写的Vue组件,比如日历组件、分页组件
├─layouts // 布局目录,用于组织应用的布局组件,不可更改⭐
├─middleware // 用于存放中间件
├─node_modules
├─pages // 用于组织应用的路由及视图,Nuxt.js根据该目录结构自动生成对应的路由配置,文件名不可更改⭐
├─plugins // 用于组织那些需要在 根vue.js应用 实例化之前需要运行的 Javascript 插件。
├─static // 用于存放应用的静态文件,此类文件不会被 Nuxt.js 调用 Webpack 进行构建编译处理。 服务器启动的时候,该目录下的文件会映射至应用的根路径 / 下。文件夹名不可更改。⭐
└─store // 用于组织应用的Vuex 状态管理。文件夹名不可更改。⭐
├─.editorconfig // 开发工具格式配置
├─.eslintrc.js // ESLint的配置文件,用于检查代码格式
├─.gitignore // 配置git忽略文件
├─nuxt.config.js // 用于组织Nuxt.js 应用的个性化配置,以便覆盖默认配置。文件名不可更改。⭐
├─package-lock.json // npm自动生成,用于帮助package的统一设置的,yarn也有相同的操作
├─package.json // npm 包管理配置文件
├─README.md
# файл конфигурации
const pkg = require('./package')
module.exports = {
mode: 'universal', // 当前渲染使用模式
head: { // 页面head配置信息
title: pkg.name, // title
meta: [ // meat
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: pkg.description }
],
link: [ // favicon,若引用css不会进行打包处理
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
},
loading: { color: '#fff' }, // 页面进度条
css: [ // 全局css(会进行webpack打包处理)
'element-ui/lib/theme-chalk/index.css'
],
plugins: [ // 插件
'@/plugins/element-ui'
],
modules: [ // 模块
'@nuxtjs/axios',
],
axios: {},
build: { // 打包
transpile: [/^element-ui/],
extend(config, ctx) { // webpack自定义配置
}
}
}
# Следующая команда запуска
{
"scripts": {
// 开发环境
"dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server",
// 打包
"build": "nuxt build",
// 在服务端运行
"start": "cross-env NODE_ENV=production node server/index.js",
// 生成静态页面
"generate": "nuxt generate"
}
}
Раздел 4: Общие элементы конфигурации Nuxt
1. Настройте IP и порт
В разработке часто встречается, что порт занят или указан IP. Нам нужно настроить элемент конфигурации в package.json в корневом каталоге. Например, теперь мы хотим настроить IP на 127.0.0.1 и порт на 1000.
/package.json
"config":{
"nuxt":{
"host":"127.0.0.1",
"port":"1000"
}
},
После настройки в терминале вводим npm run dev, после чего вы увидите, что адрес сервиса изменился на 127.0.0.1:1000.
2. Настройте глобальный CSS
При разработке многостраничных проектов мы определим глобальный CSS для инициализации рендеринга нашей страницы, например установим padding и margin на 0, а также в Интернете есть очень известный файл CSS с открытым исходным кодом normailze.css. Чтобы определить эти конфигурации, вам нужно работать с nuxt.config.js.
Например, теперь мы хотим установить красный шрифт страницы, мы можем установить красный шрифт в файле assets/css/common.css.
/assets/css/common.css
html{
color:red;
}
/nuxt.config.js
css:['~assets/css/normailze.css'],
После настройки введите npm run dev в терминале. Затем вы обнаружите, что шрифт стал красным.
3. Настройте загрузчик веб-пакета
В nuxt.config.js базовая конфигурация webpack может быть перезаписана, например, теперь нам нужно настроить url-загрузчик для 64-битной упаковки небольших изображений. Вы можете настроить его в опции сборки nuxt.config.js, перейдите по этой ссылке для получения соответствующей информации.блог woo woo woo.cn на.com/anytime-007/afraid/7…
build: {
loaders:[
{
test:/\.(png|jpe?g|gif|svg)$/,
loader:"url-loader",
query:{
limit:10000,
name:'img/[name].[hash].[ext]'
}
}
],
/*
** Run ESLint on save
*/
extend (config, { isDev, isClient }) {
if (isDev && isClient) {
config.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /(node_modules)/
})
}
}
}
4. Глобально изменить главную информацию SEO
В файле nuxt.config.js измените заголовок на wfaceboss:
head: {
title: 'wfaceboss',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: 'Nuxt.js project' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
},
После модификации перезапускаем сервис, то есть запускаем npm run dev, эффект следующий
Раздел 5: Настройка маршрутизации Nuxt и передача параметров
Маршрутизация Nuxt.js не сложна, она инкапсулирует ее для нас, что позволяет нам сохранить множество ссылок конфигурации.
1. Базовая маршрутизация
Nuxt.js отpages
Структура каталогов автоматически генерирует конфигурацию маршрутизации для модуля vue-router.
Предположениеpages
Структура каталогов выглядит следующим образом
└─pages
├─index.vue
└─user
├─index.vue
├─one.vue
Затем конфигурация маршрутизации, автоматически сгенерированная Nuxt.js, выглядит следующим образом:
router: {
routes: [
{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'user',
path: '/user',
component: 'pages/user/index.vue'
},
{
name: 'user-one',
path: '/user/one',
component: 'pages/user/one.vue'
}
]
}
2. Переход на страницу
- Не записывайте его как тег, потому что это повторная загрузка новой страницы, а не SPA.
<nuxt-link to="/users"></nuxt-link>
- this.$router.push('/users')
3. Динамическая маршрутизация
- Чтобы определить динамический маршрут с параметрами в Nuxt.js, вам необходимо создать соответствующийПрефикс с подчеркиваниемVue-файл или каталог.
- Получить динамические параметры {{$route.params.id}}
4. Маршрутизация перехода для передачи параметров и получения значений
Маршрутизация часто требует передачи параметров, мы можем просто использовать params для передачи параметров, мы сейчас передаем параметр на страницу новостей (news), а затем просто получаем его на странице новостей.
(1) Используйте nuxt для передачи параметров
<template>
<div>
<ul>
<li><nuxt-link :to="`informa/${item.newsCode}-${item.newsType}`"></li>
</ul>
</div>
</template>
Примечание: name на самом деле указывает на маршрут (имя папки или файла), а маршрут чувствителен к регистру, поэтому после to учитывается регистр! ! ! Рекомендуется, чтобы все папки были написаны в нижнем регистре.
(2) Используйте nuxt для получения параметров
async asyncData(context) {
let newsCode = context.route.params.code.split('-')[0]
let newsType = context.route.params.code.split('-')[1]
},
(3) Используйте параметры this.$router.push для передачи параметров
传递参数 -- this.$router.push({path: ' 路由 ', query: {key: value}})
参数取值 -- this.$route.query.key
注: 使用这种方式,传递参数会拼接在路由后面,出现在地址栏
(4) Используйте параметры this.$router.push для передачи параметров
传递参数 -- this.$router.push({name: ' 路由的name ', params: {key: value}})
参数取值 -- this.$route.params.key
注: 使用这种方式,参数不会拼接在路由后面,地址栏上看不到参数
注意: 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效。需要用name来指定页面。
4. Оптимизация URL-адресов требований проекта
Параметр метода this.$route.query.key отображается в адресной строке, но это не то, что нам нужно, :id?id=``?
Поэтому рекомендуется максимально использовать router-link для реализации прыжка, чтобы решить изменение адресной строки, что более удобно для оптимизации сайта.
5. Проверка параметров маршрутизации
Nuxt.js позволяет настроить компонент страницы, соответствующий динамическому маршруту.validate
Метод используется для проверки правильности параметров динамической маршрутизации. Эта функция имеет возвращаемое значение логического типа, если она возвращает истину, то это означает, что проверка пройдена, а если возвращает ложь, то это означает, что проверка не удалась.
export default {
// nuxt中使用validate方法进行路由参数校验,这个方法必须返回一个布尔值,为true表示校验通过,为false表示校验失败。注意validate不能写到methods属性中。
validate(obj) {
// console.log(obj);
// return true
return /^\d+$/.test(obj.params.id)
}
}
6. Вложенная маршрутизация
- Добавьте файл Vue в качестве родительского компонента
- Добавьте папку с тем же именем, что и у родительского компонента, для хранения дочерних компонентов представления.
- В родительском файле добавьте компонент для отображения соответствующего подпредставления.
Раздел 6: Эффект анимации маршрутизации Nuxt
Анимационный эффект маршрутизации, также известный как эффект замены страницы. Nuxt.js предоставляет два способа анимации маршрутов: один глобальный, а другой — для отдельных страниц.
1. Анимация глобальной маршрутизации
Глобальная анимация задается по умолчанию с помощью страницы.Например, теперь мы устанавливаем эффект плавного появления и исчезновения для каждой страницы при входе и выходе. Сначала мы можем создать файл normailze.css в папке assets/css в корневом каталоге.
(1) Добавить файл стиля
/assets/css/normailze.css (если нет, создайте его самостоятельно)
.page-enter-active, .page-leave-active {
transition: opacity 2s;
}
.page-enter, .page-leave-active {
opacity: 0;
}
(2) Конфигурация файла
Затем добавьте глобальный файл CSS в nuXt.config.js.
css:['assets/css/main.css'],
В это время при переключении страницы будет 2-секундный эффект переключения анимации, но вы обнаружите, что некоторые страницы не имеют никакого эффекта, потому что вы не<nuxt-link>
компонент для создания ссылок перехода. Вам нужно внести изменения.
Например, страницу новостей динамической маршрутизации, которую мы сделали на прошлом уроке, вам нужно изменить на следующую ссылку.
<li><nuxt-link :to="{name:'news-id',params:{id:123}}">News-1</nuxt-link></li>
После его изменения вы увидите эффект анимации.
2. Установить анимацию страницы отдельно
Когда мы хотим установить специальный эффект для страницы, нам нужно только изменить страницу по умолчанию в css, а затем добавить поле перехода в конфигурацию компонента страницы. Например, мы хотим добавить эффект увеличения и уменьшения шрифта на странице about, на других страницах такого эффекта нет.
(1) Добавьте следующее в глобальные ресурсы стиля/main.css
.test-enter-active, .test-leave-active {
transition: all 2s;
font-size:12px;
}
.test-enter, .test-leave-active {
opacity: 0;
font-size:40px;
}
(2) Затем установите его в компоненте about/index.vue.
export default {
transition:'test'
}
В это время присутствует уникальный динамический эффект переключения страниц.
Резюме: Просто импортируйте его на страницу, которую вам нужно использовать.
Раздел 7: Стандартные шаблоны и макеты Nuxt по умолчанию
При разработке приложений часто используются некоторые общие элементы, например, заголовок веб-страницы одинаковый, и каждая страница имеет одинаковый заголовок. На данный момент у нас есть два метода: первый способ — сделать общедоступный компонент, а второй — изменить шаблон по умолчанию. У этих двух способов есть свои преимущества и недостатки, например, общие компоненты более гибкие, но их нужно каждый раз импортировать вручную, шаблоны удобнее, но их можно вводить только на каждой странице.
1. Шаблон по умолчанию
Nuxt предоставляет нам очень простой метод настройки шаблона по умолчанию, которого можно добиться, создав app.html в корневом каталоге. Теперь мы хотим добавить слова «Learn nuxt.js» вверху каждой страницы, для этого мы можем использовать шаблон по умолчанию.
В приложении.html:
<!DOCTYPE html>
<html lang="en">
<head>
{{ HEAD }}
</head>
<body>
<p>学习nuxt.js</p>
{{ APP }}
</body>
</html>
Здесь {{ HEAD }} читает информацию в nuxt.config.js, а {{APP}} — главная страница в папке pages, которую мы написали. Следует отметить, что и HEAD, и APP должны быть написаны с большой буквы, если они будут строчными, будет сообщено об ошибке.
Примечание: Если вы создаете шаблон по умолчанию, не забудьте перезапустить сервер, иначе отображение не будет успешным, но макет по умолчанию не требует перезапуска сервера.
2. Макет по умолчанию
Функции, аналогичные шаблону по умолчанию, являются макетом по умолчанию, но, как видно из названия, макет по умолчанию в основном используется для унифицированного макета страницы. Он находится в layouts/default.vue в корне каталога. Следует отметить, что информация заголовка не должна добавляться в макет по умолчанию, только о<template>
Содержимое под этикеткой настраивается единообразно.
Требование: мы помещаем слова «Изучите nuxt.js» вверху каждой страницы и смотрим на реализацию в макете по умолчанию.
<template>
<div>
<p>学习nuxt.js</p>
<nuxt/>
</div>
</template>
здесь<nuxt/>
Это эквивалентно содержимому каждой из наших страниц. Вы также можете поместить некоторые общие стили в этот макет по умолчанию, но это увеличит сложность страницы.
Резюме: Чтобы отличить шаблон по умолчанию от макета по умолчанию, в шаблоне можно настроить большое количество информации в заголовке, включая оценку версии IE; шаблон можно только настроить.<template>
Содержание связано с макетом. Пишите код в зависимости от ситуации, когда вы модифицируете его на работе.
Раздел VIII: Используйте плагин Nuxt
1. Использование ElementUI
-
скачать npm i element-ui -S
-
В папке плагинов создайте файл ElementUI.js.
import Vue from 'vue' import ElementUI from 'element-ui' Vue.use(ElementUI)
-
Добавьте конфигурацию в nuxt.config.js
css: [ 'element-ui/lib/theme-chalk/index.css' ], plugins: [ {src: '~/plugins/ElementUI', ssr: true } ], build: { vendor: ['element-ui'] }
2. Использование аксиом
- Установить
npm install --save axios
- использовать
import axios from 'axios'
asyncData(context, callback) {
axios.get('http://localhost:3301/in_theaters')
.then(res => {
console.log(res);
callback(null, {list: res.data})
})
}
- Чтобы предотвратить повторную упаковку, настройте в nuxt.config.js
module.exports = {
build: {
vendor: ['axios']
}
}
Раздел 9: Страницы ошибок Nuxt и метанастройки личности
Когда пользователь вводит неправильный маршрут, нам нужно дать ему четкое руководство, поэтому 404 страницы необходимы при разработке приложений. Nuxt.js поддерживает создание страниц ошибок непосредственно в папке макета по умолчанию.
1. Создайте страницу ошибки
Создайте файл error.vue в папке layouts в корневом каталоге, который эквивалентен компоненту, отображающему ошибки приложения.
<template>
<div>
<h2 v-if="error.statusCode==404">404页面不存在</h2>
<h2 v-else>500服务器错误</h2>
<ul>
<li><nuxt-link to="/">HOME</nuxt-link></li>
</ul>
</div>
</template>
<script>
export default {
props:['error'],
}
</script>
Код использует v-if для определения типа ошибки.Следует отметить, что эта ошибка является<script>
Он объявлен здесь, если программа не объявлена, error.statusCode не может быть найден.
Я также использовал один здесь<nuxt-link>
Простой метод записи может напрямую идти в ногу с путем.
2. Мета-настройки личности
Мета страницы очень важна для настроек SEO.Например, если вы хотите сделать страницу новостей сейчас, чтобы поисковая система включила новости, каждая страница должна иметь разные настройки заголовка и мета для новостей. Просто используйте метод head, чтобы установить информацию заголовка текущей страницы. Теперь мы собираемся установить страницу New-1 в качестве персонализированной мета и заголовка.
1. Сначала ставимpages/news/index.vue
Модифицируется ссылка страницы и передается заголовок. Цель — получить заголовок на конкретной странице новости и сформировать заголовок статьи.
/pages/news/index.vue
<li><nuxt-link :to="{name:'news-id',params:{id:123,title:'nuxt.com'}}">News-1</nuxt-link></li>
2. После завершения первого шага мы модифицируем /pages/news/_id.vue, чтобы он стал уникальным метатегом и тегом title в соответствии с переданным значением.
<template>
<div>
<h2>News-Content [{{$route.params.id}}]</h2>
<ul>
<li><a href="/">Home</a></li>
</ul>
</div>
</template>
<script>
export default {
validate ({ params }) {
// Must be a number
return /^\d+$/.test(params.id)
},
data(){
return{
title:this.$route.params.title,
}
},
//独立设置head信息
head(){
return{
title:this.title,
meta:[
{hid:'description',name:'news',content:'This is news page'}
]
}
}
}
</script>
Примечание. Во избежание дублирования метатегов в подкомпонентах, которые не могут корректно покрывать одни и те же теги в родительских компонентах, рекомендуется использовать скрытый ключ для присвоения метатегу уникального идентификационного номера.
Раздел 10: метод asyncData для получения данных
Nuxt.js продуманно расширяет для нас метод Vue.js, добавляя anyncData для асинхронного запроса данных.
1. Поддельные данные
(1) Создать удаленные данные
Здесь, чтобы получить некоторые ложные данные с удаленных сайтов, я выбираю myjson.com, это простое хранилище json, и научиться его использовать очень удобно. Мы открываем веб-сайт, вводим код в диалоге JSON air, этот код можно вводить бесплатно, ключ и значение создаются с использованием строкового формата.
{
"name": "Nuxt",
"age": 18,
"interest": "I love coding!"
}
После ввода и сохранения веб-сайт выдаст вам адрес, который является адресом вашего склада JSON.api.myjson.com/bins/1ctwlm
(2) Установите Аксиос
Официально рекомендуемым методом удаленного сбора данных для Vue.js является Axios, поэтому мы устанавливаем официальную рекомендацию использовать Axios. Здесь мы используем npm для установки axios. Введите следующую команду прямо в терминале:
npm install axios --save
2. Метод обещания ansycData
Мы создаем новый файл под страницами с именем ansyData.vue. Затем напишите следующий код:
<script>
import axios from 'axios'
export default {
data(){
return {
name:'hello World',
}
},
asyncData(){
return axios.get('https://api.myjson.com/bins/1ctwlm')
.then((res)=>{
console.log(res)
return {info:res.data}
})
}
}
</script>
В это время мы видим, что результат уже можно выводить в браузер. Метод asyncData вернет значение в данные. Это действие перед созданием компонента (рендеринг страницы), поэтому this.info использовать нельзя,
# Важность возврата
一定要return出去获取到的对象,这样就可以在组件中使用,这里返回的数据会和组件中的data合并。这个函数不光在服务端会执行,在客户端同样也会执行。
3. Многообещающее параллельное приложение AnsycData
async asyncData(context) {
let [newDetailRes, hotInformationRes, correlationRes] = await Promise.all([
axios.post('http://www.huanjingwuyou.com/eia/news/detail', {
newsCode: newsCode
}),
axios.post('http://www.huanjingwuyou.com/eia/news/select', {
newsType: newsType, // 资讯类型: 3环评资讯 4环评知识
start: 0, // 从第0条开始
pageSize: 10,
newsRecommend: true
}),
axios.post('http://www.huanjingwuyou.com/eia/news/select', {
newsType: newsType, // 资讯类型: 3环评资讯 4环评知识
start: 0, // 从第0条开始
pageSize: 3,
newsRecommend: false
})
])
return {
newDetailList: newDetailRes.data.result,
hotNewList: hotInformationRes.data.result.data,
newsList: correlationRes.data.result.data,
newsCode: newsCode,
newsType: newsType
}
},
4. метод ожидания для ansycData
Конечно, описанный выше метод немного устарел, и теперь мы используем ансинхронизацию... ждем решения асинхронности и переписываем приведенный выше код.
<script>
import axios from 'axios'
export default {
data(){
return {
name:'hello World',
}
},
async asyncData(){
let {data}=await axios.get('https://api.myjson.com/bins/8gdmr')
return {info: data}
}
}
</script>
5. Меры предосторожности + жизненный цикл:
- Метод asyncData будет вызываться перед каждой загрузкой компонента (ограничено компонентами страницы).
- asyncData можно вызывать перед обновлением сервера или маршрута.
- Первый параметр установлен на объект контекста текущей страницы
- Nuxt объединит данные, возвращаемые asyncData, с данными, возвращаемыми методом данных компонента, и вернет их компоненту для использования.
- Для метода asyncData он вызывается перед инициализацией компонента, поэтому нет возможности передать его внутри метода.
this
для ссылки на экземпляр объекта компонента
Раздел 11: Статические ресурсы и упаковка
1. Статические ресурсы
(1)直接引入图片
在网上任意下载一个图片,放到项目中的static文件夹下面,然后可以使用下面的引入方法进行引用
<div><img src="~static/logo.png" /></div>
"~" эквивалентно нахождению корневого каталога проекта. В настоящее время не будет ошибки в пути к образу, даже если он упакован, это нормально.
(2)CSS引入图片
如果在CSS中引入图片,方法和html中直接引入是一样的,也是用“~”符号引入。
<style>
.diss{
width: 300px;
height: 100px;
background-image: url('~static/logo.png')
}
</style>
В настоящее время это совершенно нормально в npm run dev.
2. Упаковка
После создания с помощью Nuxt.js вы можете упаковать его в статический файл и поместить на сервер для запуска.
Введите в терминале:
npm run generate
Затем введите live-server в папку dist.
Резюме: Фреймворк Nuxt.js очень прост, потому что он делает большую часть вещей за нас, нам просто нужно установить его правила для написания кода.
Раздел 12: Междоменное решение Nuxt + перехватчик
Установитьaxios
npm install @nuxtjs/axios --save-dev
Измените информацию о конфигурации после завершения установки:
nuxt.config.js
module.exports = {
modules: [
// Doc: https://axios.nuxtjs.org/usage
'@nuxtjs/axios',
],
axios: {
proxy:true // 代理
},
axios: {
proxy: true,
prefix: '/api', // baseURL
credentials: true,
},
proxy: {
"/eia/":"http://192.168.0.97:8181/", // key(路由前缀):value(代理地址)
changeOrigin: true, // 是否跨域
pathRewrite: {
'^/api': '' //路径重写
}
}
}
Так как было сказаноaxios
, следует упомянуть перехватчик, который очень полезен и незаменим в процессе разработки проекта.
Например:
Установить
npm install @nuxtjs/axios @nuxtjs/proxy --save
module.expores{
plugins: [
{
src: "~/plugins/axios",
ssr: false
},
],
modules: [
// Doc: https://axios.nuxtjs.org/usage
'@nuxtjs/axios',
],
}
plugins/axios.js
export default ({ $axios, redirect }) => {
$axios.onRequest(config => {
console.log('Making request to ' + config.url)
})
$axios.onError(error => {
const code = parseInt(error.response && error.response.status)
if (code === 400) {
redirect('/400')
}
})
}
export default function (app) {
let axios = app.$axios;
// 基本配置
axios.defaults.timeout = 10000
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
// 请求回调
axios.onRequest(config => {})
// 返回回调
axios.onResponse(res => {})
// 错误回调
axios.onError(error => {})
}
Раздел 13: Восхождение на яму
1.NuxtServerError connect ECONNREFUSED 127.0.0.1:80
Причина: Asyncdata Метод асинхронных данных Запрос на асинхронные данные, что /api/$ (PPARAMS.ID} Этот интерфейс URL - 127.0.0.1:80, он отправляет запрос на 127.0.0.1:80, но я не запустил интерфейс сервера на порту 80, поэтому ошибка.
Решение:
- Измените порт сервера узла на 127.0.0.1:80.
- Измените порт сервера интерфейса на 127.0.0.1:80.
- Добавьте URL-адрес запроса, используемый методом asyncData, к доменному имени + порту, как показано ниже.
export default {
asyncData ({ params }) {
return axios.get(`https://127.0.0.1:3000/api/${params.id}`)
.then((res) => {
return { title: res.data.title }
})
}
}
1. Как импортировать файлы js в голову?
фон: в
<head>
тег, введенный в виде встроенногоflexible.js
документ. Этот проект в основном представляет собой проект мобильного терминала, представляяflexible.js
Осознайте проблему адаптации мобильного терминала.
Nuxt.js черезvue-meta
Чтобы добиться управления тегом заголовка, его можно найти, просмотрев документацию, которую можно настроить следующим образом:
head: {
script: [{ innerHTML: require('./assets/js/flexible'), type: 'text/javascript', charset: 'utf-8'}],
__dangerouslyDisableSanitizers: ['script']
}
2. Nuxt использует меньше препроцессоров, sass и другие
Предыстория: в компоненте
<template>
,<script>
или<style>
На вышеперечисленном используются различные препроцессоры, и после добавления процессора консоль сообщает об ошибке.
npm install --save-dev node-sass sass-loader
Однако процесс решения был не очень гладким.При чтении китайского документа, игнорируя номер версии и следуя приведенным выше советам, было обнаружено, что это не может быть успешным.Позже, после различных отладок, решение было наконец найдено. Осознав это, я обнаружил, что номер версии китайского документа слишком низкий.Если вам нужно просмотреть документ, вы должны прочитать последнюю версию английского документа!
3. Как использовать px2rem
Предыстория: в css напишите px, передайте
px2rem loader
, перевести px в rem
В предыдущем проекте это проходилоpx2rem loader
Реализовано, но в рамках проекта Nuxt.js добавление загрузчика css пока очень трудоемко, т.к.vue-loader
.
Я подумал о другом решении, вы можете использоватьpostcss
иметь дело с. допустимыйnuxt.config.js
Добавьте конфигурацию в файл, или вы можетеpostcss.conf.js
добавил в файл.
build: {
postcss: [
require('postcss-px2rem')({
remUnit: 75 // 转换基本单位
})
]
},
4. Как расширить конфигурацию веб-пакета
Предыстория: псевдоним каталога utils
Просто сказал, что Nuxt.js имеет встроенныйwebpack
конфигурации, если вы хотите расширить конфигурацию, вы можетеnuxt.config.js
добавил в файл. В то же время информация о конфигурации также может быть распечатана в этом файле.
extend (config, ctx) {
console.log('webpack config:', config)
if (ctx.isClient) {
// 添加 alias 配置
Object.assign(config.resolve.alias, {
'utils': path.resolve(__dirname, 'utils')
})
}
}
5. Как добавить плагин vue
Предыстория: я сам инкапсулировал плагин toast vue, так как процесс создания экземпляра vue не виден, я не знаю, когда его внедрять.
допустимыйnuxt.config.js
Добавьте конфигурацию плагинов в плагин, чтобы плагины загружались и импортировались до инициализации приложения Nuxt.js.
module.exports = {
plugins: ['~plugins/toast']
}
Файл ~plugins/toast.js:
import Vue from 'vue'
import toast from '../utils/toast'
import '../assets/css/toast.css'
Vue.use(toast)
6. Как изменить переменную среды NODE_ENV
Предыстория: В проекте установите 3
NODE_ENV
значение, соответствующее различным версиям. разработка, локальная разработка, выпуск, предварительная версия, производство, онлайн-версия. Среди них предварительная версия имеет больше vconsole, чем производственная версия.
// package.json
"scripts": {
"buildDev": "cross-env NODE_ENV=release nuxt build && backpack build",
"startDev": "cross-env NODE_ENV=release PORT=3000 node build/main.js"
},
Распечататьprocess.env.NODE_ENV
еще,production
.
В исходном коде рюкзака мы нашли ответ и выполняемbackpack build
команда, это будетprocess.env.NODE_ENV
превратиться вproduction
, жестко запрограммирован и не настраивается...
В отчаянии, только вprocess.env
вниз, добавить__ENV
атрибут, представляющийNODE_ENV
В это время информация, напечатанная на страницеprocess.env.__ENV undefined
, но могу распечататьprocess.env.NODE_ENV
.
можно настроитьnuxt.config.js
середина,env
свойства для решения проблемы.
env: {
__ENV: process.env.__ENV
}
7. Объект окна или документа не определен?
Предыстория: при внедрении сторонних плагинов или написании непосредственно в коде
window
, консоль выдаст предупреждение,window
неопределенный.
При возникновении этой проблемы сервер узла неwindow
илиdocument
объект.解决方法,通过process.browser
дифференцировать окружающую среду.
if (process.browser) {
// 引入第三方插件
require('***')
// 或者修改window对象下某一属性
window.mbk = {}
}
8. Внедрение по запросу (инфраструктура пользовательского интерфейса и т. д.)
Например, используя структуру пользовательского интерфейса:element-ui
Я нашел много связанных статей, и там нет подробностей о том, как импортировать. Так что я возьму это и объясню ему:
Давайте сначала посмотрим, если вы не вводите его по мере необходимостиvendor.js
Размер тома:
Первым шагом является загрузка зависимостей:
# 先下载element-ui
npm install element-ui --save
# 如果使用按需引入,必须安装babel-plugin-component(官网有需要下载说明,此插件根据官网规则不同,安装插件不同)
npm install babel-plugin-component --save-dev
После установки следуйтеnuxt.js
в правилах нужноplugins/
Создайте соответствующий файл плагина в каталоге
существуеткорневой каталог файласоздан (или уже существует)plugins/
каталог, создайте каталог с именем:element-ui.js
файл со следующим содержимым:
import Vue from 'vue'
import { Button } from 'element-ui' //引入Button按钮
export default ()=>{
Vue.use(Button)
}
Вторым шагом является внедрение плагина
существуетnuxt.config.js
, добавьте конфигурацию как:plugins
css:[
'element-ui/lib/theme-chalk/index.css'
],
plugins:[
'~/plugins/element-ui'
]
По умолчанию: включить SSR, использовать рендеринг на стороне сервера, или вы можетеОтключить SSR вручную, настроенный как:
css:[
'element-ui/lib/theme-chalk/index.css'
],
plugins:[
{
src:'~/plugins/element-ui',
ssr:false //关闭ssr
}
]
Третий шаг, настройка
babel
опции
существуетnuxt.config.js
, настроенный вbuild
В опциях указаны правила официального сайта:
build: {
babel:{ //配置按需引入规则
"plugins":[
[
"component",
{
"libraryName":"element-ui",
"styleLibraryName":"theme-chalk"
}
]
]
},
/*
** Run ESLINT on save
*/
extend (config, ctx) {
if (ctx.isClient) {
config.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /(node_modules)/
})
}
}
}
В этот момент мы наблюдаемРазмер файла после упаковки, как показано на рисунке:
В настоящее время, мы успешно завершили настройку импорта по требованию.
9. Где вам не нужен рендеринг на стороне сервера
(1)
<no-ssr>
插件或者组件
</no-ssr>
(2)
nuxt.config.js里ssr改为false
plugins: [
{src: '~/plugins/ElementUI', ssr: false }
],
10. Nuxt должен добавить имя домена доступа перед адресом интерфейса
Решение. Вы можете использовать базовый URL-адрес axios для прокси-сервера.
import Vue from 'vue'
import axios from 'axios'
// axios.defaults.baseURL = "http://www.huanjingwuyou.com/"
axios.defaults.baseURL = "http://localhost:3000/"
// axios.defaults.baseURL = "http://test.huanjingwuyou.com/"
export default axios
Раздел 14: Обновление Nuxt Climbing Pit — оценка устройства для перехода на мобильный телефон
NUXT не имеет страницы index.html, где мы должны написать код JS для суждения устройства, см. Мой код ниже
1. Представьте промежуточное ПО промежуточного слоя
- существует
nuxt.config.js
черезrouter
представлятьmiddleware
промежуточное ПО
nuxt.config.js
код показывает, как показано ниже
export default {
router: {
middleware: ["device"],
},
}
2. Создайте новый в корневом каталогеutils
файл и создайте новый файлdeviceType.js
deviceType.js
Код файла следующий
/**
*
* @param {*} UA ,就是userAgent
* @returns type: 设备类型
* env: 访问环境(微信/微博/qq)
* masklayer: 就是给外部拿到判断是否显示遮罩层的,一些特殊环境要引导用户到外部去打开访问
*/
function isWechat(UA) {
return /MicroMessenger/i.test(UA) ? true : false;
}
function isWeibo(UA) {
return /Weibo/i.test(UA) ? true : false;
}
function isQQ(UA) {
return /QQ/i.test(UA) ? true : false;
}
function isMoible(UA) {
return /(Android|webOS|iPhone|iPod|tablet|BlackBerry|Mobile)/i.test(UA) ?
true :
false;
}
function isIOS(UA) {
return /iPhone|iPad|iPod/i.test(UA) ? true : false;
}
function isAndroid(UA) {
return /Android/i.test(UA) ? true : false;
}
export function deviceType(UA) {
if (isMoible(UA)) {
if (isIOS(UA)) {
if (isWechat(UA)) {
return {
type: "ios",
env: "wechat",
masklayer: true,
};
}
if (isWeibo(UA)) {
return {
type: "ios",
env: "weibo",
masklayer: true,
};
}
if (isQQ(UA)) {
return {
type: "ios",
env: "qq",
masklayer: true,
};
}
return {
type: "ios",
};
}
if (isAndroid(UA)) {
if (isWechat(UA)) {
return {
type: "android",
env: "wechat",
masklayer: true,
};
}
if (isWeibo(UA)) {
return {
type: "android",
env: "weibo",
masklayer: true,
};
}
if (isQQ(UA)) {
return {
type: "android",
env: "qq",
masklayer: true,
};
}
return {
type: "android",
};
}
return {
type: "mobile",
};
} else {
return {
type: "pc",
};
}
}
3. Вmiddleware
добавить вdevice.js
документ
device.js
код показывает, как показано ниже
// @ts-nocheck
import { deviceType } from "~/utils/deviceType";
export default function(context) {
// @ts-ignore
context.userAgent = process.server ?
context.req.headers["user-agent"] :
navigator.userAgent;
// 给全局上下文添加一个属性来保存我们返回的匹配信息
context.deviceType = deviceType(context.userAgent);
// 这里注入到store,是因为我部分页面需要判断机型请求不同的数据,
// 你们没有用到的话可以移除
// context.store.commit("SetDeviceType", context.deviceType);
// 若是判断UA非移动端的,就在这里做处理了..
// context.redirect(status,url) 这个可以重定向到外部网站
// 若是内部访问可以直接用router对象push
if (context.deviceType.type === "pc") {
// context.redirect(302,'www.huanjingwuyou.com') //301是永久重定向,如果你想随着设备类型改变一直变,请改为302
} else {
context.redirect(302,'m.huanjingwuyou.com') //301是永久重定向,如果你想随着设备类型改变一直变,请改为302
}
}
Опыт:
0. Страница рендеринга Nuxt разделена на два этапа: рендеринг сервера и рендеринг браузера.
1. Nuxt может использовать asyncData на этапе рендеринга на стороне сервера для получения данных заранее, данные автоматически сохраняются в данных, а данные напрямую берутся браузером при рендеринге.
2. asyncData
Метод будет вызываться в компоненте (ограничено компонентами страницы) будет вызываться каждый раз при обновлении и загрузке страницы или при переключении маршрута, ордер находится перед beforeCreate и создается
3. В жизненном цикле рендеринга сервера nuxt создано только две функции-ловушки и функция beforeCreate.
4. асинхронность для одновременных запросов
5. Настройтесь на улучшение SEO, частично нужно вернуть {}
6. Каждый раз, когда вы вызываете интерфейс, вам нужно добавить его перед интерфейсом访问域名
, можно настроить через axiosaxios.defaults.baseURL
7. Nuxt использует прокси для прокси
8. Перейти на страницу деталей и использовать nuxt-ссылку для перехода, чтобы параметр url-адреса был более благоприятным для seo, а доменное имя при переходе сращивалось само собой
9. Напишите страницу ошибки, если вызов маршрутизации не удался или в коде есть ошибка, он перейдет на страницу ошибки.
10. Публичные статические страницы можно записать в ассеты, а потом импортировать в nuxt.config.js
11. Когда вам нужно опубликовать в Интернете.nuxt
, assets
, package.json
, nuxt.config.js
, static
Поместите его в Nginx для прокси
BUG
Как использовать асинхронные данные в компонентах?
Если компонент не является компонентом страницы, привязанным к маршруту, асинхронные данные в принципе не могут использоваться. Потому что Nuxt.js только расширяет и улучшает компоненты страницы.data
метод, чтобы он мог поддерживать асинхронную обработку данных.
Для компонентов, не являющихся страницами, есть два способа добиться асинхронного сбора данных:
- в компоненте
mounted
Метод асинхронной логики сбора данных и компонентов данных после установки предела: сервисный терминал не поддерживает рендеринг. - в компоненте страницы
asyncData
илиfetch
метод и сделать вызов API с данными какprops
передается дочерним компонентам. Серверный рендеринг работает нормально. недостаток:asyncData
Или выборка страницы может быть менее читаемой, потому что она загружает данные из других компонентов. Таким образом, какой метод использовать, зависит от того, нужно ли вашему приложению поддерживать отрисовку дочерних компонентов на стороне сервера.
Почему страницы приложений Nuxt.js мерцают?
Это потому, что врежим разработкиДалее, чтобы обеспечить горячую загрузку через Webpack, код CSS упаковывается в код JavaScript и динамически вводится на страницу, так что перерисовка элемента вызывает мерцание.
Не волнуйтесь, в продакшн-режиме код CSS будет упакован в отдельный файл и размещен в теге head, и не будет мерцания страницы.
Как изменить конфигурацию хоста и порта?
Передается непосредственно как параметр команды
nuxt --hostname myhost --port 3333
или
"scripts": {
"dev": "nuxt --hostname myhost --port 3333"
}
существуетnuxt.config.js
Средняя конфигурация:
существуетnuxt.config.js
Добавить к:
export default {
server: {
port: 8000, // default: 3000
host: '0.0.0.0', // default: localhost
},
// other configs
}
Используйте переменные окружения NUXT_HOST и NUXT_PORT.
Аналогичен HOST и PORT, но более конкретен, если вам нужно добавить что-то еще.
"scripts": {
"dev": "NUXT_HOST=0.0.0.0 NUXT_PORT=3333 nuxt"
}
Уведомление: для лучшей поддержки кроссплатформенной разработки вы можете использоватьcross-envПакет зависимостей.
Зависимости установки:
npm install --save-dev cross-env
Настройте кросс-окружение:
"scripts": {
"dev": "cross-env NUXT_HOST=0.0.0.0 NUXT_PORT=3333 nuxt"
}
Использование переменных окружения HOST и PORT
"scripts": {
"dev": "HOST=0.0.0.0 PORT=3333 nuxt"
}
существуетpackage.json
Средняя конфигурацияnuxt
:
в твоемpackage.json
Файл, добавьте:
"config": {
"nuxt": {
"host": "0.0.0.0",
"port": "3333"
}
},
"scripts": {
"dev": "nuxt"
}