открытие
Оригинальный адрес:Woohoo.C code.live/Len too/list…
Код проекта:GitHub.com/Len too/vUE-…
Некоторое время назад я видел, как некоторые друзья в группе задавали такие вопросы интервьюеру, когда они брали интервью. Обычно, когда все разрабатывают vue-проект, я считаю, что большинство людей его используют.vue-cli
Подготовьте сгенерированную схему проекта, затемnpm run install
установить зависимости,npm run serve
Запустите проект и начните писать бизнес-код.
Но для проектаwebpack
Неясное понимание инкапсуляции и настройки может легко привести к проблемам и не знать, как их решить, или не пройтиwebpack
для расширения новой функциональности.
Эта статья в основном хочет рассказать моим друзьям, как пройти шаг за шагомwebpack4
построить свой собственныйvue
среда разработки
Сначала нам нужно знатьvue-cli
Какие функции нам помог настроить сгенерированный проект?
-
ES6
код вES5
код -
scss/sass/less/stylus
Переменаcss
-
.vue
файл преобразован вjs
документ - использовать
jpg
,png
,font
и другие файлы ресурсов - Автоматически добавлять префиксы производителей css браузеров
- Горячее обновление кода
- Предварительная загрузка ресурсов
- Каждый код сборки очищает ранее сгенерированный код
- определить переменные среды
- Различие между упаковкой среды разработки и упаковкой рабочей среды
- ....
1. Построитьwebpack
основная среда
В этой статье нет подробностейwebpack
Что-то, если не очень понятно, можно сначала съездить посмотреть.официальный сайт вебпака
Проще говоря,webpack
Это упаковщик модулей, который может анализировать модули, от которых зависит ваш проект, и некоторые языки, которые браузеры не могут запускать напрямую.jsx
,vue
и т. д., чтобы преобразовать вjs
,css
файлы и т. д. для использования браузером.
1.1 Инициализировать проект
выполнить в командной строкеnpm init
Затем просто нажмите Enter до упора, в основном для получения базовой информации о проекте. в конечном итоге сгенерируетpackage.json
документ
npm init
1.2 Установкаwebpack
1.3 Напишите небольшой код для проверкиwebpack
Была ли установка успешной
создать новыйsrc
папку, а затем создайте другуюmain.js
документ
// src/main.js
console.log('hello webpack')
Затем добавьте команду скрипта ниже package.json
затем запустите команду
npm run serve
Если создан каталог distmain.js
файл, значитwebpack
работает отлично
2. Запустите функцию настройки
- создать новый
build
папка для храненияwebpack
Файлы, связанные с конфигурацией - существует
build
создать новую папкуwebpack.config.js
, настроитьwebpack
базовая конфигурация - Исправлять
webpack.config.js
настроить
- Исправлять
package.json
файл, ранее добавленныйserve
превратиться в
"serve": "webpack ./src/main.js --config ./build/webpack.config.js"
2.1 КонфигурацияES6/7/8
ПеременаES5
код
- Установить связанные зависимости
npm install babel-loader @babel/core @babel/preset-env
- Исправлять
webpack.config.js
настроить
- Добавьте один в корневой каталог проекта
babel.config.js
документ
- затем выполнить
npm run serve
команда, вы можете видеть, что код ES6 был преобразован в код ES5
2.1.1 ES6/7/8 Api
Переменаes5
babel-loader
Преобразует только синтаксис ES6/7/8 в синтаксис ES5, но не для новых API.
Мы можем предоставить реализацию нового синтаксиса некоторым клиентам, которые не поддерживают новый синтаксис через babel-polyfill.
- Установить
npm install @babel/polyfill
- Исправлять
webpack.config.js
настроить
существуетentry
добавлено в@babel-polyfill
2.1.2 Внедрение по запросуpolyfill
2.1.2 и 2.1.1 нужно настроить только один
Изменено 2019-05-05, из области комментариевпо всему небунапоминание
- Установить связанные зависимости
npm install core-js@2 @babel/runtime-corejs2 -S
- Изменить babel-config.js
Настроен на импорт по запросуpolyfill
После этого используйтеes6
вышеуказанная функция,babel
будет автоматически импортировать связанныеpolyfill
, что может сильно уменьшить объем после упаковки и компиляции
2.2 Конфигурацияscss
Переменаcss
не настроеноcss
Связанныйloader
при импортеscss
,css
Если связанные файлы упакованы, будет сообщено об ошибке
- Установить связанные зависимости
npm install sass-loader dart-sass css-loader style-loader -D
sass-loader
, dart-sass
В основном для преобразования синтаксиса scss/sass в css
css-loader
В основном парсинг css файлов
style-loader
В основном для разбора css наhtml
страницаstyle
начальство
- Исправлять
webpack.config.js
настроить
2.3 Настройка реализации PostCSS для автоматического добавления префикса CSS3
- Установить связанные зависимости
npm install postcss-loader autoprefixer -D
- Исправлять
webpack.config.js
настроить
- Создайте новый в корневом каталоге проекта
postcss.config.js
2.3 Использованиеhtml-webpack-plugin
создать html-страницу
использоватьhtml-webpack-plugin
для создания html-страниц и автоматического импорта упакованных сгенерированныхjs
документ
- Установить зависимости
npm install html-webpack-plugin -D
- Создайте новую страницу public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
- Исправлять
webpack-config.js
настроить
2.4 Настройка функции горячего обновления devServer
Благодаря функции горячего обновления кода мы можем обновить нашу страницу, не обновляя страницу.
- Установить зависимости
npm install webpack-dev-server -D
- Исправлять
webpack.config.js
настроить
по конфигурацииdevServer
а такжеHotModuleReplacementPlugin
Плагин для реализации горячего обновления
2.5 Настройте веб-пакет для упаковки изображений, мультимедиа, шрифтов и других файлов
- Установить зависимости
npm install file-loader url-loader -D
file-loader
Проанализируйте URL-адрес файла и скопируйте файл в выходной каталог.
url-loader
функция иfile-loader
Аналогично, если файл меньше предельного размера. вернусьbase64
кодировка, в противном случае используйтеfile-loader
Скопируйте файл в выходной каталог
- Исправлять
webpack-config.js
настроить Добавить кrules
Конфигурация, настройка изображений, мультимедиа и файлов шрифтов соответственно
// build/webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
module.exports = {
// 省略其它配置 ...
module: {
rules: [
// ...
{
test: /\.(jpe?g|png|gif)$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'img/[name].[hash:8].[ext]'
}
}
}
}
]
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'media/[name].[hash:8].[ext]'
}
}
}
}
]
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'fonts/[name].[hash:8].[ext]'
}
}
}
}
]
},
]
},
plugins: [
// ...
]
}
3. Пустьwebpack
Идентифицировать.vue
документ
- Установите необходимые зависимости
npm install vue-loader vue-template-compiler cache-loader thread-loader -D
npm install vue -S
vue-loader
для разбора.vue
документ
vue-template-compiler
для составления шаблонов
cache-loader
Кэшloader
Скомпилированный результат
thread-loader
использоватьworker
бассейн для запускаloader
, каждыйworker
все одноnode.js
обработать.
- Исправлять
webpack.config.js
настроить
// build/webpack.config.js
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
// 指定打包模式
mode: 'development',
entry: {
// ...
},
output: {
// ...
},
devServer: {
// ...
},
resolve: {
alias: {
vue$: 'vue/dist/vue.runtime.esm.js'
},
},
module: {
rules: [
{
test: /\.vue$/,
use: [
{
loader: 'cache-loader'
},
{
loader: 'thread-loader'
},
{
loader: 'vue-loader',
options: {
compilerOptions: {
preserveWhitespace: false
},
}
}
]
},
{
test: /\.jsx?$/,
use: [
{
loader: 'cache-loader'
},
{
loader: 'thread-loader'
},
{
loader: 'babel-loader'
}
]
},
// ...
]
},
plugins: [
// ...
new VueLoaderPlugin()
]
}
- пройти тест
- Создайте новый App.vue в src
// src/App.vue
<template>
<div class="App">
Hello World
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {};
}
};
</script>
<style lang="scss" scoped>
.App {
color: skyblue;
}
</style>
- Исправлять
main.js
import Vue from 'vue'
import App from './App.vue'
new Vue({
render: h => h(App)
}).$mount('#app')
- запустить его
npm run serve
4. Определите переменные среды
пройти черезwebpack
который предоставилDefinePlugin
Плагины, которые могут легко определять переменные среды
plugins: [
new webpack.DefinePlugin({
'process.env': {
VUE_APP_BASE_URL: JSON.stringify('http://localhost:3000')
}
}),
]
5. Различайте производственную среду и среду разработки
Создайте два новых файла
-
webpack.dev.js
Использование среды разработки -
webpack.prod.js
Использование производственной среды -
webpack.config.js
общая конфигурация -
Разница между средой разработки и производственной средой
5.1 Среда разработки
- Код сжатия не требуется
- нужно горячее обновление
- css не нужно извлекать в файл css
- sourceMap
- ...
5.2 Производственная среда
- сжатый код
- Горячее обновление не требуется
- Извлечь css, сжать css файл
- sourceMap
- Очистить содержимое последней сборки перед сборкой
- ...
- Установите необходимые зависимости
npm i @intervolga/optimize-cssnano-plugin mini-css-extract-plugin clean-webpack-plugin webpack-merge copy-webpack-plugin -D
-
@intervolga/optimize-cssnano-plugin
Используется для сжатия кода css -
mini-css-extract-plugin
Используется для извлечения css в файл -
clean-webpack-plugin
Используется для удаления файлов из последней сборки -
webpack-merge
сливатьсяwebpack
настроить -
copy-webpack-plugin
Пользователь копирует статические ресурсы
5.3 Конфигурация среды разработки
- build/webpack.dev.js
// build/webpack.dev.js
const merge = require('webpack-merge')
const webpackConfig = require('./webpack.config')
const webpack = require('webpack')
module.exports = merge(webpackConfig, {
mode: 'development',
devtool: 'cheap-module-eval-source-map',
module: {
rules: [
{
test: /\.(scss|sass)$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader',
options: {
importLoaders: 2
}
},
{
loader: 'sass-loader',
options: {
implementation: require('dart-sass')
}
},
{
loader: 'postcss-loader'
}
]
},
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('development')
}
}),
]
})
- webpack.config.js
// build/webpack.config.js
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
entry: {
// 配置入口文件
main: path.resolve(__dirname, '../src/main.js')
},
output: {
// 配置打包文件输出的目录
path: path.resolve(__dirname, '../dist'),
// 生成的 js 文件名称
filename: 'js/[name].[hash:8].js',
// 生成的 chunk 名称
chunkFilename: 'js/[name].[hash:8].js',
// 资源引用的路径
publicPath: '/'
},
devServer: {
hot: true,
port: 3000,
contentBase: './dist'
},
resolve: {
alias: {
vue$: 'vue/dist/vue.runtime.esm.js'
},
extensions: [
'.js',
'.vue'
]
},
module: {
rules: [
{
test: /\.vue$/,
use: [
{
loader: 'cache-loader'
},
{
loader: 'vue-loader',
options: {
compilerOptions: {
preserveWhitespace: false
},
}
}
]
},
{
test: /\.jsx?$/,
loader: 'babel-loader'
},
{
test: /\.(jpe?g|png|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'img/[name].[hash:8].[ext]'
}
}
}
}
]
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'media/[name].[hash:8].[ext]'
}
}
}
}
]
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'fonts/[name].[hash:8].[ext]'
}
}
}
}
]
},
]
},
plugins: [
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template: path.resolve(__dirname, '../public/index.html')
}),
new webpack.NamedModulesPlugin(),
new webpack.HotModuleReplacementPlugin(),
]
}
5.4 Конфигурация производственной среды
const path = require('path')
const merge = require('webpack-merge')
const webpack = require('webpack')
const webpackConfig = require('./webpack.config')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCssnanoPlugin = require('@intervolga/optimize-cssnano-plugin');
/* clean-webpack-plugin 3.0 以上的版本需要使用对象结构 */
// const CleanWebpackPlugin = require('clean-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = merge(webpackConfig, {
mode: 'production',
devtool: '#source-map',
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
name: 'chunk-vendors',
test: /[\\\/]node_modules[\\\/]/,
priority: -10,
chunks: 'initial'
},
common: {
name: 'chunk-common',
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
}
}
},
module: {
rules: [
{
test: /\.(scss|sass)$/,
use: [
{
loader: MiniCssExtractPlugin.loader
},
{
loader: 'css-loader',
options: {
importLoaders: 2
}
},
{
loader: 'sass-loader',
options: {
implementation: require('dart-sass')
}
},
{
loader: 'postcss-loader'
}
]
},
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: 'production'
}
}),
new MiniCssExtractPlugin({
filename: 'css/[name].[contenthash:8].css',
chunkFilename: 'css/[name].[contenthash:8].css'
}),
new OptimizeCssnanoPlugin({
sourceMap: true,
cssnanoOptions: {
preset: [
'default',
{
mergeLonghand: false,
cssDeclarationSorter: false
}
]
}
}),
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../public'),
to: path.resolve(__dirname, '../dist')
}
]),
new CleanWebpackPlugin()
]
})
5.5 Изменить package.json
"scripts": {
"serve": "webpack-dev-server --config ./build/webpack.dev.js",
"build": "webpack --config ./build/webpack.prod.js"
},
6 Анализ упаковки
Иногда нам нужно посмотреть, что упаковано после того, как упакован webpack.
В настоящее время вам необходимо использовать этот инструмент анализа модуля.webpack-bundle-analyzer
- Установить зависимости
npm install --save-dev webpack-bundle-analyzer
- Исправлять
webpack-prod.js
конфигурация, вplugins
Добавить плагин в свойства
В среде разработки нам не нужно выполнять анализ упаковки модулей, поэтому настраиваем плагин в элементах конфигурации производственной среды
- Запустите команду пакета
npm run build
После успешного выполнения эта страница будет открыта автоматически
7. ИнтеграцияVueRouter
,Vuex
- Во-первых, установить соответствующие зависимости
npm install vue-router vuex --save
7.1 ИнтеграцияVue-Router
- Добавить компонент представления
существует
src
Добавьте два новых компонента представления в каталогsrc/views/Home.vue
а такжеsrc/views/About.vue
// src/views/Home.vue
<template>
<div class="Home">
<h2>Home</h2>
</div>
</template>
<script>
export default {
name: 'Home',
data() {
return {};
}
};
</script>
<style lang="scss" scoped>
</style>
About.vue
довольствоватьсяHome.vue
Почти, положить внутрьHome
заменитьAbout
Ничего страшного
- Добавить файл конфигурации маршрутизации
существуетsrc
Добавить новый в каталогrouter/index.js
документ
// src/router/index.js
import Vue from 'vue'
import VueRouter from "vue-router";
import Home from '../views/Home';
import About from '../views/About';
Vue.use(VueRouter)
export default new VueRouter({
mode: 'hash',
routes: [
{
path: '/Home',
component: Home
},
{
path: '/About',
component: About
},
{
path: '*',
redirect: '/Home'
}
]
})
- Исправлять
main.js
документ
// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
new Vue({
router,
render: h => h(App)
}).$mount('#app')
- Исправлять
App.vue
компоненты
// App.vue
// 在 template 中添加
// src/App.vue
<template>
<div class="App">
Hello World
</div>
<div>
// router-link 组件 用来导航到哪个路由
<router-link to="/Home">go Home</router-link>
<router-link to="/About">go About</router-link>
</div>
<div>
// 用于展示匹配到的路由视图组件
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {};
}
};
</script>
<style lang="scss" scoped>
.App {
color: skyblue;
}
</style>
бегатьnpm run serve
Команда, если нет ошибки конфигурации, вы можете видеть, что нажатие на разные маршруты переключится на разные представления маршрутизации.
7.2 Настройка отложенной загрузки маршрутизации
В случае маршрута не настроена ленивая загрузка, компонент маршрутизации в нашей упаковке, что они будут упакованы в одинjs
файл, когда у нас будет все больше и больше компонентов представления, это вызовет этоjs
Файлы становятся все больше и больше. Тогда это приведет к увеличению времени запроса этого файла, что в конечном итоге повлияет на работу пользователя.
- Установить зависимости
npm install @babel/plugin-syntax-dynamic-import --save-dev
- Исправлять
babel.config.js
module.exports = {
presets: [
[
"@babel/preset-env",
{
useBuiltIns: "usage"
}
]
],
plugins: [
// 添加这个
'@babel/plugin-syntax-dynamic-import'
]
}
- Исправлять
router/index.js
файл конфигурации маршрутизации
import Vue from 'vue'
import VueRouter from "vue-router";
Vue.use(VueRouter)
export default new VueRouter({
mode: 'hash',
routes: [
{
path: '/Home',
component: () => import(/* webpackChunkName: "Home" */ '../views/Home.vue')
// component: Home
},
{
path: '/About',
component: () => import(/* webpackChunkName: "About" */ '../views/About.vue')
// component: About
},
{
path: '*',
redirect: '/Home'
}
]
})
- Команда выполнения
npm run build
Проверьте, сгенерировано ли оноHome...js
файл иAbout...js
документ
7.3 Интеграция Vuex
- существует
src
Создайте новый в каталогеstore/index.js
документ
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
counter: 0
}
const actions = {
add: ({commit}) => {
return commit('add')
}
}
const mutations = {
add: (state) => {
state.counter++
}
}
const getters = {
getCounter (state) {
return state.counter
}
}
export default new Vuex.Store({
state,
actions,
mutations,
getters
})
- Исправлять
main.js
импорт файловvuex
// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store' // ++
new Vue({
router,
store, // ++
render: h => h(App)
}).$mount('#app')
- Исправлять
App.vue
, проверьте эффект конфигурации vuex
// App.vue
<template>
<div class="App">
<div>
<router-link to="/Home">go Home</router-link>
<router-link to="/About">go About</router-link>
</div>
<div>
<p>{{getCounter}}</p>
<button @click="add">add</button>
</div>
<div>
<router-view></router-view>
</div>
</div>
</template>
<script>
import { mapActions, mapGetters } from 'vuex'
export default {
name: 'App',
data() {
return {};
},
computed: {
...mapGetters(['getCounter'])
},
methods: {
...mapActions(['add'])
}
};
</script>
<style lang="scss" scoped>
.App {
text-align: center;
color: skyblue;
font-size: 28px;
}
</style>
- Команда выполнения
npm run serve
При нажатии на кнопку мы можем увидеть нашgetCounter
увеличивается
8 Резюме
На данный момент мы успешно построилиvue
Среда разработки, но есть еще некоторые функции, которых не хватает, и заинтересованные партнеры могут общаться. В процессе строительства еще будет много ям.
Если вы не знакомы с webpack, рекомендуется собрать его самостоятельно. получить более глубокое пониманиеvue-cli
что это сделало для нас
Код проекта:GitHub.com/Len too/vUE-…
Рекомендуемое чтение
-
Используйте различные плагины webpack, чтобы повысить эффективность разработки
-
Проект Vue-cli3 от оптимизации сборки до развертывания докера
Добро пожаловать, чтобы следовать
Добро пожаловать в общедоступный номер»разработка кода», делясь последней технической информацией каждый день