這裏將介紹如何從零開始搭建一套包含調試,構建的vue腳手架,其中主要是對webpack的學習,以及如今一些經常使用的集成在腳手架中前端功能的使用好比:babel,代碼壓縮,代碼熱更新等等。本文適合掌握了前端基礎以及vue相關知識的程序猿觀看學習,最主要的是要有顆熱愛這個行業的心(滑稽),也請各位大神指教指教,不喜勿噴,若是對你起到了一絲絲的幫助也請給咱點個贊~javascript
安裝webpack以及webpack-cli(使用webpack必須的依賴)css
npm i webpack webpack-cli
複製代碼
安裝webpack-dev-server(用於調試,熱更新等)html
npm i webpack-dev-server
複製代碼
新建package.json前端
npm init -y
複製代碼
新建index.htmlvue
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue-cli-simple</title>
</head>
<body>
</body>
</html>
複製代碼
新建src目錄而且新建main.js用於作入口文件java
在根目錄新建webpack.config.js用於webpack配置node
module.exports = {};
複製代碼
最終項目結構爲webpack
首先在main.js中寫入es6
alert('這是一個頁面')
複製代碼
接着將webpack配置文件webpack.config.js更改web
const path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'app.js'
},
devServer: {
historyApiFallback: true,
overlay: true
}
};
複製代碼
entry:要打包的js文件
path:最後生成文件的路徑
publicPath:使用調試模式時文件的位置
filename:最後生成的文件名
最後修改index.html引入打包好的js,因爲path,publicPath咱們寫的是相同的因此這邊咱們只要用/dist/app.js就都能訪問(無論是調試模式仍是最後打包出來)
index.html加上
<script src="/dist/app.js"></script>
複製代碼
最後改動package.json加入調試以及打包的命令
"scripts": {
"serve": "webpack-dev-server --open --hot",
"build": "webpack --progress --hide-modules"
}
複製代碼
運行 npm run serve
運行 npm run build
首先babel咱們知道是用來適配新語法的因此咱們修改main.js,加入一些語法,如箭頭函數,let
let babelTest= ()=>{
alert('這裏是babelTest方法')
}
babelTest()
複製代碼
運行後能夠找到app.js
npm install babel-loader @babel/core @babel/preset-env babel-polyfill
複製代碼
在根目錄建立.babelrc文件(用於配置),如今咱們先放空
{}
複製代碼
接着在改動webpack.config.js中加入
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
複製代碼
簡單介紹一下這邊的rules,webpack在進行編譯的時候會讀取rules選項,並根據裏面的配置處理文件。
test說明須要處理的文件類型,exclude是要忽略的文件,use中就是處理的方法。
這裏的配置就是處理全部的js文件,可是忽略全部node_modules中的js,最後使用babel-loader去處理匹配到的js文件。
如今再次運行
npm install babel-polyfill
複製代碼
把webpack.config.js的entry改一下
entry: ['babel-polyfill', './src/main.js']
複製代碼
用es6中的async/await試一下,改動main.js
function sendMes() {
return new Promise((resolve, reject) => {
resolve('這裏是數據');
})
}
async function getData(){
const data = await sendMes();
console.log(data)
}
getData()
複製代碼
運行後
安裝vue
npm install vue
複製代碼
改動main.js
import Vue from 'vue';
var app = new Vue({
el: '#app',
data: {
message: '這裏是vue'
}
複製代碼
改動index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue-cli-simple</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script src="/dist/app.js"></script>
</body>
</html>
複製代碼
運行
在webpack.config.js加入
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
}
複製代碼
再次運行便可
安裝依賴
npm i node-sass css-loader vue-style-loader sass-loader
複製代碼
在src目錄下新建一個styles文件夾並在其中新建common.css
body{
font-size: 30px;
}
複製代碼
改動webpack.config.js
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
}
]
複製代碼
這邊咱們用了一個新的rule是關於css文件的處理,值得一提的是,若是use中有多個處理方法,那麼會從下往上依此處理,這邊就是先用css-loader加載css,再用vue-style-loader把加載好的樣式加入近vue中。
修改main.js加入
import './styles/common.css';
複製代碼
能夠看到樣式生效了
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
},
{
test: /\.scss$/,
use: [
'vue-style-loader',
'css-loader',
'sass-loader'
],
}
]
複製代碼
styles中建立scssTest.scss
body{
div{
color: red;
}
}
複製代碼
main.js中引入,再次運行便可看到效果
安裝依賴
npm i vue-loader vue-template-compiler
複製代碼
改動webpack.config.js加入一個針對.vue文件的loader
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
'scss': [
'vue-style-loader',
'css-loader',
'sass-loader'
]
}
}
}
複製代碼
而且添加一個vueloader的插件,多說一句這裏在vue-loader中又多加了一個針對scss的loader,使得咱們能夠在vue文件中使用scss。
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
...
plugins: [
new VueLoaderPlugin()
]
...
}
複製代碼
在src中新建App.vue
<template>
<div>
<p>{{ userInput }}</p>
<input v-model="userInput">
</div>
</template>
<script>
export default {
data(){
return{
userInput:'測試'
}
}
}
</script>
<style scoped lang="scss">
div{
p{
color: blue
}
}
</style>
複製代碼
修改main.js
import Vue from 'vue';
import App from './App.vue';
import './styles/common.css';
import './styles/scssTest.scss'
new Vue({
el: '#app',
template: '<App/>',
components: { App }
})
複製代碼
修改index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue-cli-simple</title>
</head>
<body>
<div id="app"></div>
<script src="/dist/app.js"></script>
</body>
</html>
複製代碼
運行
咱們在日常的開發中遇到的報錯後面都會有詳細的信息,如錯誤行數等,方便咱們定位錯誤。而在webpack中輸出的是編譯事後的錯誤位置。如今咱們在App.vue中輸出一個值。
export default {
data(){
return{
userInput:'測試'
}
},
mounted(){
console.log('測試')
}
}
複製代碼
module.exports = {
...
devtool: '#eval-source-map'
...
}
複製代碼
再次運行的話
執行打包命令 npm run build
壓縮使用webpack中的UglifyJSPlugin插件便可
npm install uglifyjs-webpack-plugin
複製代碼
修改webpack.config.js,再加入一個插件
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
...
plugins: [
new UglifyJSPlugin(),
new VueLoaderPlugin()
]
...
}
複製代碼
由於加入了錯誤調試的代碼,咱們須要將上一步所加的東西去除,可是爲了調試的時候有,打包的時候沒有就須要加入一個環境變量,安裝
npm i cross-env --save-dev
複製代碼
cross-env用於改變環境
改動package.json
"scripts": {
"serve": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --mode production --progress --hide-modules"
}
複製代碼
這樣webpack.config.js就能夠經過判斷process.env.NODE_ENV來進行區別
改動webpack.config.js,在最後加上
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '';
}
複製代碼
再次打包
瞭解了這簡單版本的腳手架如何構建,總的來講webpack給前端帶來便利性,工程性是史無前例的, 雖然慢慢有更好的方案開始代替它,可是他的思想仍是值得咱們去學習的。固然cli的構建遠沒有這麼簡單,不過有了雛形以後一點點完善它也是一種樂趣所在吧。