webpack搭建vue專案,實現腳手架功能
本文基於node.js開發環境,安裝完node之後新建專案,通過webpack配置,實現vue-cli腳手架功能
對於剛剛接觸程式設計的人來說,最難的可能並不是學習一種新語法或者框架,而是程式設計思維,這種思維在除錯的時候顯得尤為重要,擁有良好的程式設計習慣和思維能力可以大幅度提高除錯效率。而程式設計思維的培養往往需要經驗的積累,只有把底層原理一遍遍地思考之後,才會有更深入的理解,這也是vue官方文件中不建議vue初學者直接使用vue-cli的原因之一。
所以今天特意一步步通過webpack配置,實現與vue-cli相同的效果,希望大家能有所收穫。
1. 建立一個vue專案
使用命令列mkdir vuedeom 或者直接新建一個vuedemo空資料夾,然後命令列cd vuedemo,使用npm init -y初始化,此時你會看到資料夾多了一個package.json的檔案,內容大致如下:
{ "name": "vuedemo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
2. 引入webpack
通過npm載入webpack,當然如果速度慢的話你也可以使用淘寶映象,npm install -g cnpm –registry=https://registry.npm.taobao.org,然後輸入命令:cnpm install webpack --save-dev
接下來我們在專案根目錄建立一個src檔案,有一個main.js,再建立一個webpack.config.js,最後修改package.json的指令碼:
const path = require('path')//引入node內建模組path module.exports ={ entry:'./src/main.js',// 入口檔案,把src下的main.js編譯到出口檔案 output:{//出口檔案 path:path.resolve(__dirname,'dist'),//出口路徑和目錄 filename:"demo.js"//編譯後的名稱 } }
//package.json { "name": "vuedemo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "build":"webpack"//當使用npm run build的時候就會執行webpack,按照提示安裝webpack-cli }, "keywords": [], "author": "", "license": "ISC" }
3. babel編譯
雖然ES6語法已經廣泛普及,但各個瀏覽器還不是特別相容,為了避免出錯我們需要把ES6轉成ES5,使用babel進行編譯
npm install --save-dev babel-core babel-loader
載入完成之後,在webpack.config.js配置
const path = require('path') module.exports ={ entry:'./src/main.js', output:{ path:path.resolve(__dirname,'dist'), filename:"demo.js" }, module:{ rules:[//遍歷規則 { test: /\.js$/,//匹配以js結尾的檔案 loader:"babel-loader", // 使用babel-loader編譯 exclude: /node_modules///node_module裡面的內容不遍歷 } ] } }
我測試的時候出現了這樣的錯誤,如果有相同情況的可以參考下:
Error: Cannot find module '@babel/core' babel-loader@8 requires Babel 7.x (the package '@babel/core'). If you'd like to use Babel 6.x ('babel-core'), you should install 'babel-loader@7'.
這是因為版本之間的不相容,按照上面的要求,你可以安裝低版本的babel-loader@7
也有可能webpack會發出這樣的警告:
WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
你需要給指令碼配置一個環境,一般build我們會用生產環境webpack --mode production,而dev會使用生產環境webpack --mode development (這個下面會講)
另外,有時候我們可能會遇到不能識別webpack命令,原因未知,不過重新安裝一次就可以了...
接下來需要讓babel-loader翻譯官具有翻譯的功能:
npm install babel-preset-es2015 --save-dev
並且新建一個.babelrc的檔案,裡面新建
{ "presets":["es2015"] }
如果需要轉譯ES7語法,你還需要安裝
npm install babel-preset-stage-0 --save-dev
同樣在.babelrc新增
"presets":["es2015"."stage-0"]
每次修改配置之後都要重新編譯:npm run build
4. 解析樣式
上面我們實現了vue引入和es6以及es7語法轉譯,現在我們來解析樣式,需要安裝兩個包
npm install css-loader style-loader --save-dev
css-loader將css解析成模組,style-loader將解析的內容插入到style標籤內
別忘了在配置裡webpack.config.json新增規則
rules:[{test:/\.css$/,use:['style-loader','css-loader']}]
但是大多數時候,我們在vue中會使用樣式預處理語言,比如sass、less、stylus,同樣地我們需要安裝對應的包,新增對應的規則
npm install less less-loader --save-dev
rules:[ {test:/\.less$/,use:['style-loader','css-loader','less-loader']}]
5. 解析圖片
圖片是大多數專案不可獲取的部分,怎樣解析圖片呢?和解析樣式步驟差不多,我們需要先安裝包再新增規則
npm install file-loader url-loader --save-dev
rules:[
{test:/\.(jpg|png|gif)$/,use:'url-loader?limit=8192'},
{test:/\.(eot|svg|woff|woff2|wtf)$/,use:'url-loader'}
]
limit表示轉化base64只在8192位元組一下轉化,其他情況輸出圖片
6. 解析html
我們希望build之後能有一個html檔案,能直接看到編譯之後的效果
這時就需要一個外掛,外掛的作用是以我們自己的html為模板將打包後的結果,自動引入到html中產出到dist目錄下
npm install html-webpack-plugin --save-dev
在webpack.config.js引入這個外掛
let HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { ....省略 plugins:[new HtmlWebpackPlugin({//自動插入到dist目錄中 template:'./index.html'//使用模板 filename:'login.html'//產出名稱(一般不寫) })] }
build之後你就可以看到dis下有一個index.html檔案
7. 開發環境
一個專案建立分為開發環境和生產環境(上線),那麼在開發的時候每次都需要build很不方便,而且build之後相當於最終的程式碼,不能隨意更改,我們需要把這些內容都放到記憶體中,通過npm run dev開啟
npm install webpack-dev-server --save-dev
這裡邊內建了服務,可以幫我們啟動一個埠號,當代碼更新時,自動在記憶體中打包,程式碼有變化就重新執行
並且在package.json新增一個新指令碼:"dev":"webpack-dev-server --mode development"
一般webpack-dev-server會內建一個埠,通過這個埠就能檢視編譯的內容了,比如我的埠號:http://localhost:8080
8. 配置vue
上面我們已經實現了基本的webpack配置,完成了html、css、less、圖片、js等檔案的解析,但我們最終想要的適合vue-cli一樣的效果,這就要求我們還要對vue語法進行解析,如果你在main.js引入vue模組,使用vue時,你會發現控制檯列印這樣的錯誤
vue.runtime.esm.js:620 [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.
這是因為預設的vue引用的是vue.runtime.common.js,不能編譯模板,你可以在引入vue的時候直接import Vue from 'vue/dist/vue'
另外一種辦法是,你可以使用render函式,注意render()要有返回值
但是不管是改變vue引用js還是使用render函式都是不方便的,我們更希望頁面元件能以.vue檔案載入到html檔案中
我們可以通過安裝vue-loader(解析.vue檔案)和vue-template-compiler(解析template模板)實現
npm install vue-loader vue-template-compiler --save-dev
之後我們在main.js引入App.vue模組,然後在render()引用:render:(h)=>h(App)
最後
到這裡我們就實現了和vue-cli初始化出來的vue專案一樣的效果,其實整個過程並不算太難,不過一步步實現還是很有幫助,vue初學者可以動手試試。當然,文章可能會有我疏忽的地方,有問題隨時聯絡我呀~