cnpm i @vue/cli -g ----- 4的腳手架 ------ webpack 4css
cnpm i @vue/cli@3 -g ----- 3的腳手架 ------ webpack 4html
vue create myappvue
cnpm i vue-cli -g ----- 2的腳手架 ------ webapck 3node
vue init webpack myappreact
vue init webpack myappwebpack
17年使用vue-cli 2的腳手架,用的是webpack3,命令爲vue init webpack myappios
18年使用@vue/cli 3的腳手架,用的是webpack4,命令爲vue create myappes6
新的腳手架兼容舊的版本建立項目,使用模塊 @vue/cli-initweb
2 和 3 的區別能夠說是 webpack 3和 webpack4的區別vue-cli
webpack4 免配但可配,webpack3 必配
vue的腳手架 基於 webpack4 免配的
react的腳手架 基於 webpack4 配置的
基於node,模塊化、組件化開發的利器,配置名稱爲 webpack.config.js
webpack起初是facebook專門爲react而量身打造的,後開源,其餘語言也在用
module.exports = { }
console.log('hello webpack')
module.exports = { // entry: './src/main.js' // string類型寫法 entry: { // object 類型寫法 ---- 推薦寫法 app: './src/main.js' // 會將本項目打包成爲一個js文件 app.js } }
module.exports = { // entry: './src/main.js' // string類型寫法 entry: { // object 類型寫法 ---- 推薦寫法 app: './src/main.js' // 會將本項目打包成爲一個js文件 app.js }, // +++++++++++++++++++++++++++++++++++++++++++ output: { // 輸出配置 ----- dist/app.js path: __dirname + '/dist', // 項目打包在dist目錄下 filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js } }
cnpm i webpack@3 -g
命令行輸入 webpack 指令 便可打包, dist/app.js出現
<!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>Document</title> </head> <body> </body> <!-- ++++++++++++++++++++++++++ --> <script src="dist/app.js"></script> </html>
刪除 index.html 中導入js文件
module.exports = { // entry: './src/main.js' // string類型寫法 entry: { // object 類型寫法 ---- 推薦寫法 app: './src/main.js' // 會將本項目打包成爲一個js文件 app.js }, output: { // 輸出配置 ----- dist/app.js path: __dirname + '/dist', // 項目打包在dist目錄下 filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js }, // ++++++++++++++++++ plugins: [ // 添加插件 ---- 數組 ] }
cnpm i webpack@3 -D 基礎模塊 ---- 必須安裝
cnpm i html-webpack-plugin -D
const webpack = require('webpack'); // ++++++++++++++++ const HtmlWebPackPlugin = require('html-webpack-plugin');// ++++++++++++++++ module.exports = { // entry: './src/main.js' // string類型寫法 entry: { // object 類型寫法 ---- 推薦寫法 app: './src/main.js' // 會將本項目打包成爲一個js文件 app.js }, output: { // 輸出配置 ----- dist/app.js path: __dirname + '/dist', // 項目打包在dist目錄下 filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js }, plugins: [ // 添加插件 ---- 數組 // ++++++++++++++++++++++++++ new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件 template: 'index.html' // 找的就是當前文件夾下的index.html文件 }) ] }
從新執行webpack指令,發現dist文件夾下生成一個index.html文件,而且自動引入了生成的js文件
plugins: [ // 添加插件 ---- 數組 // ++++++++++++++ 無需安裝額外模塊,基於webpack的基礎模塊 new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件 new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件 template: 'index.html' // 找的就是當前文件夾下的index.html文件 }) ]
控制檯運行webpack,從新打包查看app.js已爲壓縮過的js文件
html { background-color: #f66; }
import './main.css'; // +++++++++++++++++++ console.log('hello webpack')
運行命令webpack,發現如下錯誤,須要安裝合適解析器去解析css模塊語法
ERROR in ./src/main.css Module parse failed: Unexpected token (1:5) You may need an appropriate loader to handle this file type.
const webpack = require('webpack'); const HtmlWebPackPlugin = require('html-webpack-plugin'); module.exports = { // entry: './src/main.js' // string類型寫法 entry: { // object 類型寫法 ---- 推薦寫法 app: './src/main.js' // 會將本項目打包成爲一個js文件 app.js }, output: { // 輸出配置 ----- dist/app.js path: __dirname + '/dist', // 項目打包在dist目錄下 filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js }, plugins: [ // 添加插件 ---- 數組 new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件 new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件 template: 'index.html' // 找的就是當前文件夾下的index.html文件 }) ], // +++++++++++++++++++ module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 ] } }
cnpm i style-loader css-loader@0 -D
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 { test: /\.css$/, // 處理的是以css爲結尾的css模塊 loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部 } ] }
cnpm i node-sass sass-loader@7 -D
html { background: #00f; }
import './main.scss'; console.log('hello webpack')
報錯 同上
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 { test: /\.css$/, // 處理的是以css爲結尾的css模塊 loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部 }, // +++++++++++++++++++++ { test: /\.scss$/, loader: 'style-loader!css-loader!sass-loader' } ] }
運行webpack,瀏覽頁面,發現爲藍色,代表scss配置成功
cnpm i less less-loader -D
html { background: #0f0; }
import './main.less'; console.log('hello webpack')
報錯 同上
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 { test: /\.css$/, // 處理的是以css爲結尾的css模塊 loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部 }, { test: /\.scss$/, loader: 'style-loader!css-loader!sass-loader' }, // +++++++++++++++++++ { test: /\.less$/, loader: 'style-loader!css-loader!less-loader' } ] }
運行webpack,瀏覽頁面,發現爲綠色,代表less配置成功
cnpm i stylus stylus-loader -D
html{ background: #000; }
import './main.stylus'; console.log('hello webpack')
報錯 同上
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 { test: /\.css$/, // 處理的是以css爲結尾的css模塊 loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部 }, { test: /\.scss$/, loader: 'style-loader!css-loader!sass-loader' }, { test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, // +++++++++++++++++++ { test: /\.stylus$/, loader: 'style-loader!css-loader!stylus-loader' } ] }
運行webpack,瀏覽頁面,發現爲黑色,代表stylus配置成功
其實最重要的就是解析js的高級語法,讓他能夠在瀏覽器中訪問
cnpm i babel-core@6 babel-loader@7 -D
若是要使用js最新的語法,那麼須要安裝相應的模塊而且配置
env 包含了 es2015 以及 es7.....
cnpm i babel-preset-es2015 babel-preset-env -D
若是須要作react應用,還需安裝模塊
cnpm i babel-preset-react -D
根目錄下建立 文件 .babelrc, 文件能夠省,可是配置不能省,省是配置到了webpack的配置文件
{ "presets": ["es2015", "env", "react"] }
添加js的解析器
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標.... rules: [ // 解析器規則 { test: /\.css$/, // 處理的是以css爲結尾的css模塊 loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部 }, { test: /\.scss$/, loader: 'style-loader!css-loader!sass-loader' }, { test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, { test: /\.stylus$/, loader: 'style-loader!css-loader!stylus-loader' }, // +++++++++++++++++++++++++++++++ { test: /\.js$/, loader: 'babel-loader' } ] }
cnpm / npm i file-loader url-loader -D
添加相關配置信息
{ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: path.posix.join('static','img/[name].[hash:7].[ext]') } }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: path.posix.join('static', 'media/[name].[hash:7].[ext]') } }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: path.posix.join('static', 'fonts/[name].[hash:7].[ext]') } }
vue 項目中 npm run serve 啓動開發者服務器
webpack 能夠配置開發者服務器
cnpm i webpack-dev-server@2 -g
cnpm i webpack-dev-server@2 -D
控制檯運行 webpack-dev-server 指令,查看效果
修改代碼繼續查看效果,發現代碼會自動更新
cnpm i axios -S
src/main.js 處請求數據,遇到跨域問題
import './main.css'; import axios from 'axios'; console.log('hello webpack! 開發者服務器') axios.get('http://47.92.152.70/pro').then(res => { console.log(res.data) })
devServer: { // 開發者服務器配置 host: '0.0.0.0', // 默認值是127.0.0.1,改成0.0.0.0以後局域網內能夠經過ip地址訪問 port: 8080, // 默認訪問服務器的端口號 // open: true, // 打開默認瀏覽器,通常設置爲false proxy: { // 解決跨域問題 '/api': { target: 'http://47.92.152.70', // 代理哪個服務器 changeOrigin: true, // 代理 pathRewrite: { '^/api': '' // 以 /api 開頭的請求,認爲就是請求的代理 // /api/pro ===> http://47.92.152.70/pro } } } }
修改請求代碼,查看效果
axios.get('/api/pro').then(res => { console.log(res.data) })
"scripts": { "dev": "webpack-dev-server", "build": "webpack" },
resolve: { extensions: ['.js', '.vue', '.jsx'], // 表明缺省的後綴名,引入時能夠省略的後綴名 --- import axios from './request'; 而不用 import axios from './request.js'; alias: { // 別名 '@': path.join(__dirname, './', 'src') // src 的別名爲 @ } }
webpack配置別名
resolve: { extensions: ['.js', '.vue', '.jsx'], // 表明缺省的後綴名,引入時能夠省略的後綴名 --- import axios from './request'; 而不用 import axios from './request.js'; alias: { // 別名 '@': path.join(__dirname, './', 'src'), // src 的別名爲 @ // +++++++++++++++++++++++++++ 'vue$': 'vue/dist/vue.esm.js' // 打包vue項目必須得寫的別名 } }
cnpm i vue -S
cnpm i vue-loader@14 vue-template-compiler -D
配置vue文件的解析器
{ test: /\.vue$/, loader: 'vue-loader' }
剩下的就是普通的vue的項目開發
cnpm i react react-dom -S
經過運行不一樣的命令,表示不一樣的環境
cnpm i cross-env -D
修改packages.json
"scripts": { "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js", "build": "cross-env NODE_ENV=production webpack --config webpack.config.js" },
修改webpack.config.js
const isDev = process.env.NODE_ENV =='development' plugins: [ // 添加插件 ---- 數組 new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件 new webpack.DefinePlugin({ // ++++++++++++++ 'process.env':{ NODE_ENV:isDev?'"development"':'"production"', } }), new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件 template: 'index.html' // 找的就是當前文件夾下的index.html文件 }) ],