記錄一下自己使用 webpack4 搭建vue環(huán)境的步驟帐萎,僅供參考耸别。
一捐晶、創(chuàng)建目錄
1.創(chuàng)建項(xiàng)目目錄并且初始化項(xiàng)目
mkdir Webpack-Vue
cd Webpack-Vue
npm init -y
- 創(chuàng)建項(xiàng)目內(nèi)子目錄
mkdir src src/components dist
dist 用于存放 Webpack 打包后的項(xiàng)目文件伸刃、src 用于存放源代碼文件
- 創(chuàng)建入口文件
touch src/main.js
touch src/index.html
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
npm i webpack webpack-dev-server webpack-cli webpack-merge -D
三屯吊、配置webpack
npm i terser-webpack-plugin@4.1.0 html-webpack-plugin@3.2.0 -D
創(chuàng)建如下文件送巡,用來配置webpack
touch webpack.config.js webpack.dev.js webpack.prod.js
接下來編寫配置文件
- webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 輸入
entry: {
bundle: path.resolve(__dirname, './src/main.js')
},
// 輸出
output: {
path: path.resolve(__dirname, './dist'),
filename: '[name].[hash].js'
},
module: {
rules: []
},
resolve: {
alias: {},
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './src/index.html'),
filename: "index.html",
title: 'webpack-vue',
minify: {// 壓縮HTML文件
removeComments: true, // 移除HTML中的注釋
collapseWhitespace: true, // 刪除空白符與換行符
minifyCSS: true// 壓縮內(nèi)聯(lián)css
}
}),
]
}
- webpack.dev.js
const path = require('path');
const webpackMerge = require('webpack-merge');
const webpackConfig = require('./webpack.config');
module.exports = webpackMerge(webpackConfig, {
mode: 'development',
devtool: 'inline-source-map',
devServer: {
contentBase: path.resolve(__dirname, './dist'),
open: true,
compress: true,
host: "0.0.0.0",
port: 8080
}
})
- webpack.prod.js
const webpackMerge = require('webpack-merge');
const webpackConfig = require('./webpack.config');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = webpackMerge(webpackConfig, {
mode: 'production',
optimization: {
minimize: true,
minimizer: [new TerserPlugin({
test: /\.js(\?.*)?$/i,
})],
},
})
- 編寫package.json scripts 腳本
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --config webpack.prod.js",
"start": "webpack-dev-server --open --config webpack.config.js"
},
控制臺運(yùn)行:
npm run start
四、 安裝 Vue及Vue-router:
- 安裝vue
npm i vue --save
修改 main.js 文件:
import Vue from 'vue';
import App from './App';
new Vue({
el:'#app',
template:'<App/>',
components: { App }
});
同級目錄下創(chuàng)建一個(gè) App.vue 文件
<template>
<h1>Hello World!</h1>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
html, body {
padding: 0;
margin: 0;
box-sizing: border-box;
font-size: 16px;
}
</style>
- 添加vue-router
首先控制臺安裝vue-router依賴包:
npm install vue-router --save
在src目錄下創(chuàng)建router文件夾并在此文件夾下創(chuàng)建index.js文件:
mkdir src/router && touch src/router/index.js
在router/index.js中編寫如下代碼:
import Vue from 'vue'
import VueRouter from 'vue-router'
// 組件
import Home from '../components/home/Home.vue'
Vue.use(VueRouter)
export default new VueRouter({
routes: [{
path: '/',
name: 'Home',
component: Home
}]
})
創(chuàng)建Home組件:
mkdir src/components/home && touch src/components/home/Home.vue
home組件中添加代碼:
<template>
<div class="Home">
homePage
</div>
</template>
<script>
export default {
name: 'home',
data() {
return {}
},
}
</script>
<style lang="less">
</style>
在main.js中修改代碼:
import Vue from 'vue';
import App from './App.vue';
import router from './router';
Vue.config.debug = true;//開啟錯(cuò)誤提示
//系統(tǒng)錯(cuò)誤捕獲
const errorHandler = (error, vm) => {
console.error('全局異常:', error);
Activity.saveLog('全局異常:', error)
}
Vue.config.errorHandler = errorHandler;
new Vue({
el: '#app',
router,
render: h => h(App)
})
在App.vue中修改代碼:
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
<style>
html,
body {
padding: 0;
margin: 0;
box-sizing: border-box;
font-size: 16px;
}
</style>
五盒卸、引入各種loader
- babel-loader
為了使 JavaScript 代碼兼容更多環(huán)境骗爆,需要使用 babel-loader。
配置方法:
安裝 babel-loader蔽介、babel-preset-env 和 babel-core摘投。 babel-loader 是 7.x 版本的話,babel-core 必須是 6.x 版本虹蓄; babel-loader 是 8.x 版本的話犀呼, babel-core 必須是 7.x 版本。
安裝命令如下:
npm i babel-loader@7 babel-core babel-preset-env -D
然后在 webpack.config.js 的 module.rules 中新增
{
test: /\.js$/,
use:'babel-loader',
exclude: /node_modules/
}
添加一個(gè)配置文件(.babelrc)在根目錄下:
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}]
]
}
- file-loader
這個(gè)用于將字體文件薇组、圖片文件進(jìn)行模塊化外臂。首先安裝 file-loader:
npm i file-loader -D
在 webpack.base.conf.js 中配置module.rules:
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: [
'file-loader'
]
}
- vue-loader
安裝 vue-loader、css-loader体箕、vue-style-loader 和 vue-template-compiler
npm i vue-loader css-loader vue-style-loader vue-template-compiler -D
配置 webpack.base.conf.js
{
test: /\.vue$/,
loader:'vue-loader'
},
{
test: /\.css$/,
use: ['vue-style-loader','css-loader']
}
在頭部引入:
const VueLoaderPlugin = require('vue-loader/lib/plugin');
在 plugins 數(shù)組中添加這個(gè)插件
new VueLoaderPlugin(),
配置別名专钉,將 resolve.alias 配置:
{
'vue$':'vue/dist/vue.esm.js',
'@': path.resolve(__dirname,'../src'),
}
添加一個(gè) resolve.extensions 屬性:
extensions: ['*', '.js', '.json', '.vue'],
- babel-preset-stage-3
安裝:
npm isntall --save-dev babel-preset-stage-3
修改.babelrc配置,在presets添加stage-3:
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-3"
]
}
運(yùn)行npm run start 就可以使用了
六累铅、其他配置
- 打包刪除上次的dist文件夾
安裝clean-webpack-plugin
npm install clean-webpack-plugin --save-dev
配置webpack.config.js
//引入clean-webpack-plugin
const CleanWebpackPlugin = require('clean-webpack-plugin')
// 在plugins中配置
plugins: [new CleanWebpackPlugin(["dist"])]
- 多環(huán)境打包配置
一般情況下會(huì)分為開發(fā)環(huán)境跃须、預(yù)發(fā)環(huán)境、生產(chǎn)環(huán)境娃兽,接下來配置一下打包環(huán)境
在src目錄下創(chuàng)建environments目錄并創(chuàng)建4個(gè)文件
mkdir environments
cd environments
touch environment.js environment.dev.js environment.stage.js environment.prod.js
environment.js // 打包時(shí)會(huì)把環(huán)境寫入到這里
environment.dev.js // 開發(fā)環(huán)境
environment.stage.js // 預(yù)發(fā)環(huán)境
environment.prod.js // 生產(chǎn)環(huán)境
environment.prod.js
文件中編寫
export default environment = {
apiHost: 'http://api.prod.com', // 生產(chǎn)環(huán)境接口地址
sourceHost: 'http://www.prod.com', // 生產(chǎn)環(huán)境域名
env: 'prod'
}
environment.stage.js
文件中編寫
export default environment = {
apiHost: 'http://api.stage.com', // 預(yù)發(fā)環(huán)境接口地址
sourceHost: 'http://www.stage.com', // 預(yù)發(fā)環(huán)境域名
env: 'stage'
}
environment.dev.js
文件中編寫
export default environment = {
apiHost: 'http://api.dev.com', // 開發(fā)環(huán)境接口地址
sourceHost: 'http://www.dev.com', // 開發(fā)環(huán)境域名
env: 'dev'
}
package.json
文件中配置scripts
:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prestart": "cat ./src/environments/environment.dev.js > ./src/environments/environment.js",
"start": "webpack-dev-server --open --config webpack.config.js",
"prebuild": "cat ./src/environments/environment.prod.js > ./src/environments/environment.js",
"build": "webpack --config webpack.prod.js",
"prebuild:dev": "cat ./src/environments/environment.dev.js > ./src/environments/environment.js",
"build:dev": "webpack --config webpack.prod.js",
"prebuild:stage": "cat ./src/environments/environment.stage.js > ./src/environments/environment.js",
"build:stage": "webpack --config webpack.prod.js"
},
執(zhí)行命令就可以按環(huán)境打包了菇民,如:
npm run build:dev
- 安裝vuex
npm install vuex --save
在src中目錄中創(chuàng)建store/index.js
mkdir src/store && touch src/store/index.js
在store/index.js中編寫代碼:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state: {},
getters: {},
mutations: {},
actions: {}
})
在main.js導(dǎo)入并掛載到vue的實(shí)例上:
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store'
Vue.config.debug = true;//開啟錯(cuò)誤提示
//系統(tǒng)錯(cuò)誤捕獲
const errorHandler = (error, vm) => {
console.error('全局異常:', error);
Activity.saveLog('全局異常:', error)
}
Vue.config.errorHandler = errorHandler;
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})