之前已經介紹了關於Vue的腳手架vue-cli的安裝,以及一些文件目錄介紹。具體可以查看《vue 入坑教程(一)——搭建vue-cli腳手架》
下面簡單說一下具體的文件介紹
(一) package.json 配置文件
package.json是項目的配置文件,里面是項目的相關的包依賴,npm運行命令,位於項目根目錄。
{
"name": "ddlcwecaht", ---------------------項目名稱
"version": "1.0.0", ---------------------項目版本號(以上兩者是必須的,否則無法執行install)
"description": "A Vue.js project", ---------------------項目描述
"author": "wujy", ---------------------作者名稱(以上這些都和vue-cli搭建的時候填寫的信息是一致的,當然這里也可以修改)
"private": true,
"scripts": { ---------------------定義npm命令
"dev": "webpack-dev-server --inline --progress --open --config build/webpack.dev.conf.js", ------------cnpm run dev 運行項目
"start": "npm run dev", ----------------------和上面的相同,運行項目
"build": "node build/build.js" ----------------------cnpm run build項目打包構建
},
"dependencies": { ---------------------運行時的依賴
"axios": "^0.18.0",
"vue": "^2.5.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1",
"vux": "^2.9.0"
},
"devDependencies": { -----------------------開發時的依賴
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-import": "^1.7.0"
……
},
"engines": { -------------------------環境的版本號
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [ ------------------------瀏覽器的版本號
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
1. scripts
指定了運行腳本命令的npm命令行縮寫,比如start指定了運行npm run start時,所要執行的命令。
dev: "webpack-dev-server --inline --progress --open --config build/webpack.dev.conf.js"
執行命令:cnpm run dev,其中webpack-dev-server啟動本地的服務器, --inline --progress啟動時分行展示啟動的進度條,--open啟動完成后自動打開瀏覽器,--config build/webpack.dev.conf.js啟動時調用的配置文件
"build": "node build/build.js"
執行的命令: cnpm run build,build/build.js運行時調用的配置文件,命令執行之后會生成一個dist文件夾,里面存放的是打包構建后的文檔,用於正式環境。
2. dependencies 和 devDependencies
這兩項分別是項目運行所依賴的模塊、項目開發所依賴的模塊。他們的成員比如 "vue": "^2.5.2",分別由模塊名和對應的版本號組成,表示依賴的模塊及其版本范圍。
這些依賴在執行了cnpm install之后都會添加到node_modules文件夾中。
可以通過命令添加自己需要的依賴:(這里使用的是淘寶鏡像)
#將該模塊寫入dependencies屬性
cnpm install <name> --save
#該模塊寫入devDependencies屬性
cnpm install <name> --save-dev
命令執行結束之后,刷新,可以看到package.json里面對應的增加了剛才下載的依賴,同樣的在node_modules文件夾里也增加了相同對應的依賴
3. engines 和 browserslist
分別表示項目所需要的node.js版本號、瀏覽器的版本號。
注意:
- vue不支持IE8及其以下的版本。
- 注意本地的node的版本號是否符合。 可以打開命令行控制面板,通過
node -v和npm -v查看本地的版本號package.json文檔中不能加注釋,不然會報錯
(二)src/router/index.js 路由文件
/* 使用模塊化機制編程,導入Vue和VueRouter,要調用 Vue.use(VueRouter)*/
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
/*定義路由*/
export default new Router({
/*當切換到新路由時,想要頁面滾到頂部。不設置頁面將在默認的地方*/
scrollBehavior(to, from, savedPosition) {
return {x: 0, y: 0}
},
routes: [{ ------------------------配置路由
path: '/', ------------------------路由路徑
redirect: '/home' ------------------------路由重定向
},
{
path: '/home',
name: 'home', -------------------------路由需要的組件
component: (resolve) => require(['@/views/home/home.vue'], resolve),
},
{
path: '/login',
name: 'login',
component: (resolve) => require(['@/views/login/login.vue'], resolve),
meta: { ---------------路由的元信息
title: '登錄'
}
},
}]
})
具體的可以參考官網vue-router
代碼中可以通過this.$router來使用,實現頁面跳轉,路由信息的傳值。
(三) 基礎配置文件 webpack.base.conf.js
這是webpack最為基礎的配置文件,主要是來定義入口文件,處理vue,babel等各種模塊。由此還有兩個配置文件分別是開發環境配置文件 webpack.dev.conf.js 和生產模式配置文件 webpack.prod.conf.js
/*定義變量,引入需要的配置*/
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
const vuxLoader = require('vux-loader')
var PostCompilePlugin = require('webpack-post-compile-plugin')
var TransformModulesPlugin = require('webpack-transform-modules-plugin')
/*處理路徑的函數*/
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
context: path.resolve(__dirname, '../'), //基礎路徑
entry: {
app: './src/main.js' //入口文件
},
output: {
path: config.build.assetsRoot, //輸出文件,默認是打包編譯之后會生成一個dist文件夾來存儲輸出文件
filename: '[name].js', //輸出文件名字
publicPath: process.env.NODE_ENV === 'production' ? //生產環境和開發環境判斷,來確定引用的publicpath
config.build.assetsPublicPath : config.dev.assetsPublicPath
},
resolve: { //解析確定的擴展名,方便模塊的導入
extensions: ['.js', '.vue', '.json'],
alias: { //創建別名
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'), //方便模塊的引用,比如@/components/HelloWorld = src/components/HelloWorld
}
},
module: { //模塊的相關配置
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader', //babel,用來將es6轉換為es5,解決部分瀏覽器不支持es6的問題
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, //圖片類型
loader: 'url-loader', //url-loader 文件大小低於指定的限制時,可返回 DataURL,即base64
options: {
limit: 10000, //默認無限制
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, //音頻類型
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, //字體類型
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
setImmediate: false,
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
},
plugins:[ //可以添加自定義的插件
new PostCompilePlugin(),
new TransformModulesPlugin()
]
}
(四)開發環境配置文件 webpack.dev.conf.js
開發環境的配置文件在項目啟動的時候就會運用的,比較重要。
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config') //基礎配置的參數
const merge = require('webpack-merge') //用來合並webpack配置文件的
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf') //引入webpack基礎的配置文件
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin') //幫你自動生成一個html5文件, 這個文件中自動引用了你打包后的JS文件。每次編譯都在文件名中插入一個不同的hash值。可以去打包后的dist文件夾中查看html文件
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') //能在終端更好的查看webpack的警告和錯誤
const portfinder = require('portfinder') //自動檢索下一個可用端口,比如8080端口被占用,啟動后會自動調用8081端口打開項目
const HOST = process.env.HOST //讀取系統環境變量host
const PORT = process.env.PORT && Number(process.env.PORT) //讀取系統環境變量端口號
const devWebpackConfig = merge(baseWebpackConfig, { //合並基礎配置文件
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
devtool: config.dev.devtool,
devServer: { //webpack-dev-server服務器配置
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true, //開啟熱加載,熱加載是指代碼啟動后,修改代碼,會自動檢測代碼的更新,瀏覽器自動渲染更新的部分
contentBase: false,
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser, //啟動項目的時候自動打開瀏覽器,默認的是false。可以在config/index.js中修改為true,啟動的時候就會自動打開瀏覽器
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable, //代理設置,前后端分離,解決跨域問題
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [ //webpack一些構建用到的插件
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(), //模塊熱替換它允許在運行時更新各種模塊,而無需進行完全刷新
new webpack.NamedModulesPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
/*打包后會自動生成一個html文件,並自動將 打包過程中輸出的js、css的路徑添加到html文件中,css文件插入到head中*/
new HtmlWebpackPlugin({
filename: 'index.html', // 指定編譯后生成的html文件名
template: 'index.html',
inject: true
}),
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
process.env.PORT = port;
devWebpackConfig.devServer.port = port;
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ //webpack錯誤提示的插件
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
(五)src/app.vue vue文件
<template>
<div id="app">
<img src="./assets/logo.png">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'app',
data(){
return {}
},
methods:{}
}
</script>
<style lang="scss" scoped>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
<template></template>標簽內存放的是 HTMLDOM 結構,注意:只能有一個頂級標簽<script></script>標簽內存放的是 js 內容,用來寫邏輯代碼。里面有data,methods,props,components……等,具體的可以參考Vue官網<style></style>標簽內放的是 CSS 樣式,加上scoped表示該樣式只在這個.vue文件中有效,還可以用scss來寫,具體請自行百度查詢。
(六)src/main.js 入口文件
import Vue from 'vue'
import router from './router'
Vue.config.productionTip = false; //生產環境提示,這里設置成了false
// 引入reset.scss
import './assets/styles/reset.scss'
// 引入小圖標
import 'font-awesome/css/font-awesome.css'
/*引入vue-awesome-swiper組件和樣式,swsiper參考4.x的API,前提,先安裝vue-awesome-swiper插件*/
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
Vue.use(VueAwesomeSwiper);
/*引入vuex*/
import store from '@/utils/vuex.js'
new Vue({router, store}).$mount('#app');
項目的入口文件main.js,全局的設置可以在這里添加。
(七)其他
- 編碼規范
.editorconfig - babel配置文件
.babelrc - 實用代碼段
utils.js - 編譯入口文件
build.js - 生產模式配置文件
webpack.prod.conf.js
寫的有點亂,本文的參考文章:《vue-cli項目結構詳解》,作者博客:tanzhenyan的博客
