用了好幾回vue-cli,仍是決定手工搭建一個vue2+webpack4項目
1.爲了可拓展性
2.vue.config.js真是用的不開心
3.對webpack4和vue2的合做瞭解的更多
本文代碼的git地址 github.com/shaohuanhua…
參考的 www.jianshu.com/p/6ff34032a…
前面幾步基本同樣,爲了更易理解,文件命名和位置作了改動,更接近vue-cli3
javascript
新建一個imitateCli文件夾,打開終端開始構建
css
npm init
複製代碼
安裝框架所需基本:
html
npm i webpack vue vue-loader -D
複製代碼
(vue-loader:解析和轉換 .vue 文件,提取出其中的邏輯代碼 script、樣式代碼 style、以及 HTML 模版 template,再分別把它們交給對應的 Loader 去處理)
vue
npm i webpack-cli -s -d (webpack4 已經開始使用webpack-cli)<br>
npm i css-loader vue-template-compiler -D<br>
複製代碼
(css-loader:加載由 vue-loader 提取出的 CSS 代碼。 )
(vue-template-compiler:把 vue-loader 提取出的 HTML 模版編譯成對應的可執行的 JavaScript 代碼)
而後咱們在src目錄下面新建一個app.vue文件,裏面就能夠寫一些關於項目的業務代碼:
java
<template>
<div> luckfine </div>
</template>
<script> export default { data () { //text: 'luckfine' } } </script>
<style> </style>
複製代碼
後綴爲.vue 文件是不能夠在瀏覽器裏直接運行的,咱們得讓它運行起來。
如今咱們要在項目根目錄下新建一個webpack.config.js文件,webpack(號稱打包一切)它作的事情是,分析你的項目結構,找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),並將其打包爲合適的格式以供瀏覽器使用。
咱們在src目錄下新建一個main.js做爲入口文件,順便在裏面寫點東西:
node
// main.js
import Vue from 'vue'
import App from './app.vue'
const root = document.createElement('div')
document.body.appendChild(root)
new Vue({
render: (h) => h(App)
}).$mount(root)
複製代碼
main.js準備完畢以後,那麼在webpack.config.js裏面就能夠這樣寫:
webpack
// webpack.config.js
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
entry: path.join(__dirname, 'src/main.js'),
mode:'develop',
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'dist')
},
module: {
rules: [
{
test: /.vue$/,
loader: 'vue-loader'
}
]
},
plugins:[
new VueLoaderPlugin()
],
}
複製代碼
webpack把全部的文件打包成一個bundle.js文件,而且是能在瀏覽器裏面直接運行的代碼。
如今咱們能夠在package.json 文件裏的scripts對象裏面添加一個腳本:
(注意:webpack4中已經在啓動時用mode指定啓動環境)
git
"scripts": {
"build": "webpack --config webpack.config.js --mode=development"
},
複製代碼
添加完這段以後,咱們再去terminal執行下npm run build,會發現build成功
github
爲了本地能啓動咱們的項目,咱們能夠安裝一個devServerweb
npm install webpack-dev-server -s -d
npm install html-webpack-plugin -d -s
複製代碼
此時的webpack.config.js
// webpack.config.js
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
function resolve(dir) {
return path.join(__dirname, dir)
}
module.exports = {
entry: path.join(__dirname, 'src/main.js'),
mode: 'develop',
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'dist')
},
module: {
rules: [
{
test: /.vue$/,
loader: 'vue-loader'
}
]
},
plugins:[
new VueLoaderPlugin(),
new HtmlWebpackPlugin()
],
devServer: {
historyApiFallback: {
index: `/dist/index.html`
},
host: '0.0.0.0',
port: '8014',
disableHostCheck: true
}
}
複製代碼
package.json中添加啓動入口
"dev": "webpack-dev-server --inline --hot --mode=development",
複製代碼
此時咱們在terminal執行npm run dev
便可看到他自動給咱們建立了一個index.html,把打包好的js插入進裏面,且項目已經能夠運行
0.0.0.0:8014 或者 localhost:8014
devServer應該默認hot:true的吧
npm install vue-router -d -s
複製代碼
// main.js
import VueRouter from 'vue-router'
import router from './router' // 路由單獨放個文件
Vue.use(VueRouter)
...
new Vue({
router, // 全局引入
render: (h) => h(App)
}).$mount(root)
複製代碼
建文件public/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>cli demo</title>
</head>
<body>
<noscript>
<strong>不支持script</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
複製代碼
// main.js
import Vue from 'vue'
import App from './app.vue'
import VueRouter from 'vue-router'
import router from './router'
Vue.use(VueRouter)
// const root = document.createElement('div')
// document.body.appendChild(root)
new Vue({
router,
render: (h) => h(App)
}).$mount('#app')
複製代碼
<!--App.vue-->
<template>
<div> <!--這個元素及其子元素會把index.html裏的#app替換掉 -->
<router-view></router-view> <!--路由匹配的組件在此-->
</div>
</template>
<script> export default { name: 'App', data () { return {} } } </script>
複製代碼
// router.js
import Router from 'vue-router'
// import navList from '@/router/nav.config.json'
// 也能夠把路由寫成個json,供多處使用
const findPwd = () => import('../views/login/find_pwd.vue') // 懶加載,須要webpack配置動態import
const routes = [{
path: '/find_pwd',
component: findPwd,
name: '找回密碼'
}]
export default new Router({
routes
})
複製代碼
這就能經過路由訪問了 http://localhost:8014/#/find_pwd
1.新建一個文件夾build,放入3個webpack配置文件代替webpack.config.js,以下
build --webpack.base.conf.js
|--webpack.dev.config.js
|--webpack.prod.config.js
複製代碼
在webpack.base.conf.js
公共配置,包括對.vue, .css, .scss, 圖片,字體處理的loader,babel轉碼,css代碼提取,入口文件處理
在webpack.dev.config.js
配置devServer,eslint,html模板處理,output處理
webpack.prod.config.js
打包壓縮文件,splitChunks代碼分割提取,html模板處理,output處理, 代碼分析
process.env的NODE_ENV,由圖5設置
2.修改包描述文件的命令
"scripts": {
"build": "webpack --config build/webpack.prod.conf.js",
"dev": "webpack-dev-server --config build/webpack.dev.conf.js --inline --hot"
},
複製代碼
用npm run build 雖然能打包成功,可是運行時報錯,說沒找到Vue。
我打開依賴包裏的vue,發現主入口是dist/vue.runtime.common.js(運行版vue),
如圖6, 由於vue-loader+render才能用運行版,後面再優化
index.html裏的BASE_URL?
import Vue from '../node_modules/vue/dist/vue.js'
複製代碼
果真打包的靜態文件也能夠運行了 我還沒寫完