注:基於webpack3.X的版本,webpack4.X的版本不適用
參考連接:
https://segmentfault.com/a/1190000012789253?utm_source=tag-newest
個人github:
https://github.com/meilulan/webpack-vue-practicehtml
cd webpack-vue-practice npm init -y
「-y」表示將項目設置默認,之後可在package.json中更改vue
npm install --save-dev webpack@3 webpack-dev-server@2 npm i --save-dev vue
index.htmlnode
<!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>基於webpack3.X的vue開發環境</title> </head> <body> </body> </html>
webpack.config.jswebpack
const path = require('path'); const webpack = require('webpack'); module.exports = { }
到目前爲止,項目目錄的總體結構以下:git
util.jsgithub
export default function say() { console.log("hello webpack!!"); }
main.jsweb
import say from './util'; say();
webpack.config.jsnpm
const path = require('path'); const webpack = require('webpack'); module.exports = { entry: './src/main.js',//項目的入口文件 output: { path: path.resolve(__dirname, './dist'),//項目的打包文件目錄 publicPath: '/dist/',//經過devServer訪問路徑 filename: 'index.js'//打包後的文件名 }, devServer: { historyApiFallback: true,//若是找不到界面就返回默認首頁index.html overlay: true//能夠在瀏覽器打開的頁面顯示終端編譯時產生的錯誤 } }
package.jsonjson
"scripts": { "dev": "webpack-dev-server --open --hot", "build": "webpack --progress --hide-modules" },
index.html
<body> <script src="/dist/build.js"></script> </body>
npm run dev
能夠發現瀏覽器自動打開了一個窗口,在瀏覽器的控制檯裏輸出"hello webpack"
而且能夠發現,咱們隨意修改util.js的文件,瀏覽器會自動刷新
npm run build
能夠發現,在項目中自動新建了「/dist/build.js」的路徑和文件
main.js
import Vue from 'vue'; const vue = new Vue({ el: "#app", data: { message:"hello webpack-vue" } });
index.html
<div id="app">{{message}}</div>
resolve: {//幫組webpack找到bundle中須要引入的模塊代碼,這些代碼包含在每一個require/import語句中 alias: { 'vue$': 'vue/dist/vue.esm.js' } }
webpack.config.js文件的總體配置以下:
const path = require('path'); const webpack = require('webpack'); module.exports = { entry: './src/main.js',//項目的入口文件 output: { path: path.resolve(__dirname, './dist'),//項目的打包文件目錄 publicPath: '/dist/',//經過devServer訪問路徑 filename: 'build.js'//打包後的文件名 }, devServer: { historyApiFallback: true,//若是找不到界面就返回默認首頁index.html overlay: true//能夠在瀏覽器打開的頁面顯示終端編譯時產生的錯誤 }, resolve: {//幫組webpack找到bundle中須要引入的模塊代碼,這些代碼包含在每一個require/import語句中 alias: { 'vue$': 'vue/dist/vue.esm.js' } } }
注:webpack默認只支持js的模塊化,如需其餘格式的文件當成模塊引入,須要用到webpack的loader解析器
終端
npm install --save-dev css-loader vue-style-loader
終端
npm install --save-dev node-sass sass-loader
module: { rules: [ //css { test: /\.css$/, use: [ "vue-style-loader", "css-loader" ] }, //scss爲擴展名的sass { test: /\.scss$/, use: [ "vue-style-loader", "css-loader", "sass-loader" ] }, //sass爲擴展名的sass { test: /\.sass$/, use: [ "vue-style-loader", "css-loader", "sass-loader" ] } ] }
在src目錄下,新建「assets」目錄,並在其下新建common.scss文件,寫入如下樣式
common.scss
body { color: rgb(0, 128, 0); }
啓動後,能夠看到瀏覽器中的文字顏色已改變,說明scss文件已經起做用了
有些瀏覽器不是很支持ES6的語法,咱們可使用babelES6轉換爲ES5語法。
npm install --save-dev babel-loader @babel/core @babel/preset-env
module: { rules: [ //babel { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ] }
exclude:是指不須要使用的文件或目錄,相對應的是include(手動指定哪些文件或目錄)
.babelrc
{ "presets": [ [ "@babel/preset-env", { "modules": false, "targets": { "browsers": [ ">0.25%", "not op_mini all" ] } } ] ] }
babel的配置具體見babel官網
由於babel-core只是對新引入的語法進行轉換,好比箭頭函數、塊級做用域等
但對新引入的對象,例如Promise、Set等這些只能使用babel的插件:@babel/plugin-transform-runtime
在項目開發環境中引入@babel/plugin-transform-runtime,同時在生產環境引入@babel/runtime
npm install --save-dev @babel/plugin-transform-runtime npm install --save @babel/runtime
在.babelrc配置文件中引入plugin
"plugins": [ [ "@babel/plugin-transform-runtime", { "absoluteRuntime": false, "corejs": false, "helpers": true, "regenerator": true, "useESModules": false } ] ]
.babelrc文件內容總體以下:
{ "presets": [ [ "@babel/preset-env", { "modules": false, "targets": { // The % refers to the global coverage of users from browserslist "browsers": [ ">0.25%", "not op_mini all" ] } } ] ], "plugins": [ [ "@babel/plugin-transform-runtime", { "absoluteRuntime": false, "corejs": false, "helpers": true, "regenerator": true, "useESModules": false } ] ] }
npm install --save-dev file-loader
module: { rules: [ //圖片 { test: /\.(png|jpe?g|gif|svg)$/, loader: 'file-loader', options: { name: '[name].[ext]?[hash]' } } ] }
main.js
Vue.component('my-pic', { template: '<img :src="url" />', data() { return { url: require('./img/example.png') } } });
index.html
<div id="app"> <p>{{message}}</p> <my-pic></my-pic> </div>
運行項目就能看到該圖片了。
在前面,咱們使用了Vue.component來定義全局的組件
但在實際項目中,更推薦使用單文件組件
npm install --save-dev vue-loader vue-template-compiler
webpack.config.js
const vueLoaderPlugin = require('vue-loader/lib/plugin'); module:{ rules:[ //vue單文件組件 { test:/\.vue$/, loader:'vue-loader', options:{ loaders:{ 'scss':[ 'vue-style-loader', 'css-loader', 'sass-loader' ], 'sass':[ 'vue-style-loader', 'css-loader', 'sass-loader' ] } } } ] }, plugins:[ new vueLoaderPlugin(), ]
App.vue
<template> <div id="app"> <h1>{{msg}}</h1> <img src="./img/example.png" /> <input type="text" v-model="msg" /> </div> </template> <script> import say from "./util"; export default { name: "app", data() { return { msg: "the first vue page" }; }, created() { this.getSay(); }, methods: { async getSay() { let what = await say(); this.msg = what; } } }; </script> <style lang="scss"> #app { h1 { color: red; } } </style>
main.js
import Vue from 'vue'; import App from './App.vue' import './assets/common.scss'; const vue = new Vue({ el: "#app", components: { App }, template: '<App/>' });
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>基於webpack3.X的vue開發環境</title> </head> <body> <div id="app"></div> <script src="/dist/build.js"></script> </body> </html>
運行項目,便可看到頁面能正確顯示。