введение
Официальный инструмент генерации проектов vue-cli не поддерживает многостраничные веб-приложения, но в реальных проектах нам нужны такие скаффолдинги, ссылаясь на множество отличных методов, вот способ преобразования моего одностраничного скаффолдинга в схему многостраничного строительные леса для справки. Пожалуйста, поправьте меня, если я ошибаюсь.
Подготовить
Используйте vue-cli для создания необходимых вам одностраничных каркасов проекта, а затем мы начнем наш проект модификации.
процесс рефакторинга
Шаг 1 Измените структуру каталогов
- step1 Создайте новую папку представлений в каталоге src, а затем создайте новую папку индекса в папке представлений.
- step2 Переместите main.js и App.vue из каталога src в папку index на шаге 1 и переименуйте main.js в index.js.
- шаг 3 Переместите папку маршрутизатора в каталоге src в папку index в шаге 1. Если вы не используете маршрутизатор, вы можете закомментировать его в index.js. Я не использую его, потому что каждая из моих страниц не является одностраничное приложение, в нем нет необходимости. Используйте функцию маршрутизации.
- шаг 4 Переместите файл index.html из корневого каталога в папку index на шаге 1.
Шаг 2. Измените файл конфигурации при сборке.
В продакшене уникальные js-файлы будут упакованы в отдельные страницы, а общедоступные js будут извлекаться, чтобы все не паковалось в ком. Структура каталогов файлов после упаковки также относительно ясна. Все модификации находятся в папке сборки
- step1 Измените utils.js, добавьте две функции, одна используется для получения мультивхода страницы, другая используется для ввода упакованной страницы и внедрить js:
var glob = require('glob')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var PAGE_PATH = path.resolve(__dirname, '../src/views')
var merge = require('webpack-merge')
//多入口配置
//获取views文件夹下,每个页面下的index.js作为页面入口,故每个页面下都必须有index.js
exports.entries = function() {
var entryFiles = glob.sync(PAGE_PATH + '/*/index.js')
var map = {}, tmp = [], pathname = '';
entryFiles.forEach((filePath) => {
var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
tmp = filePath.split('/').splice(-4)
map[tmp[2] + '/' + filename] = filePath
})
return map
}
//多页面输出配置
//读取views文件夹下的对应每个页面的html后缀文件,然后放入数组中
//如果想要更深的定制或者修改,建议大家看一下CommonsChunkPlugin
//推荐一个基础的 https://segmentfault.com/q/1010000009070061
exports.htmlPlugin = function() {
let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
let arr = []
entryHtml.forEach((filePath) => {
let jsPath = '', tmp = [];
let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
tmp = filePath.split('/').splice(-4)
jsPath = tmp[2] + '/' + 'index'
let conf = {
template: filePath,
filename: filename + '.html',
chunks: ['manifest', 'vendors', jsPath],
inject: true
}
if (process.env.NODE_ENV === 'production') {
conf = merge(conf, {
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
},
chunksSortMode: 'dependency'
})
}
arr.push(new HtmlWebpackPlugin(conf))
})
return arr
}
- step2 Измените запись, настроенную в файле webpack.base.conf.js.
// entry: {
// app: './src/main.js'
// },
entry: utils.entries(),
- step3 Измените метод упаковки файла webpack.dev.conf.js Найдите следующий код и закомментируйте его:
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
Добавьте наш метод выше после значения атрибута plugins, и ниже приведен фрагмент кода:
// new HtmlWebpackPlugin({
// filename: 'index.html',
// template: 'index.html',
// inject: true
// }),
new FriendlyErrorsPlugin()
].concat(utils.htmlPlugin())
- шаг 4 Изменить webpack.prod.conf.js Найдите следующий код и закомментируйте его:
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
Добавьте наш метод выше после значения атрибута plugins, и ниже приведен фрагмент кода:
new CopyWebpackPlugin([{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}])
].concat(utils.htmlPlugin())
Конфигурация завершена. Просто запустите проект в обычном режиме.
постскриптум
В начале я тоже подобрал некоторые решения в интернете для использования, но ведь каждый рефакторит проект под свои нужды.Если это решение не соответствует вашим требованиям, то предлагаю все-таки настроить его под свои потребности Модификации. Я просто хочу поделиться с вами своим планом. Я опубликую код на github для дальнейшего использования. Если у вас есть какие-либо вопросы, вы можете отправить электронное письмо для обсуждения, я отвечу вовремя. Почта: Shuai.XUE@supinfo.com
Demo
Ниже приведен адрес проекта на github для справки:vue-multipage
В эту подмость добавлено больше сервисов на основе оригинала:
- Имитационный сервис, может управлять на уровне модуля
- Используйте axios для инкапсуляции базового получения ajax, и можно вызвать метод post.
- Добавлены модули vuex и split.
- Оптимизированная структура каталогов и унифицированная конфигурация информации интерфейса
Конкретно можно посмотреть код проекта.Если он не соответствует потребностям, то можно его доработать.Также надеюсь, что вы сможете указать на недостатки. Здесь просто предоставить вам план и идею, тот, который подходит вам лучше всего.