webpack打包,
能夠知道有哪些模塊化的相關規范
能夠使用webpack
能夠使用Vue單文件組件
webpack 非模塊js。模塊化相關規范
webpack用法
Vue單文件組件
傳統開發模式的主要問題
命名沖突
文件依賴
通過模塊化解決上述問題
模塊化就是把單獨的一個功能封裝到一個模塊(文件)中,模塊之間相互隔離,但是可以通過特定的接口公開內部成員,也可以依賴別的模塊。
模塊化開發的好處:
方便代碼的重用,從而提升開發效率,并且方便后期的維護。
Require.js(http://www.require.cn/)
Sea.js(https://seajs.github.io/seajs/docs/)
模塊分為單文件模塊與包
模塊成員導出:module.exports和exports
模塊成員導入:require(‘模塊標識符’)
在ES6模塊化規范誕生之前,JavaScript社區已經嘗試提出了AMD、CMD、CommonJS等模塊化規范。
但是,這些社區提出的模塊化標準,還是存在一定的差異性與局限性、并不是瀏覽器與服務器通用的模塊化標準,例如:
AMD和CMD適用于瀏覽器端的JavaScript模塊化
CommonJS適用于服務器端的JavaScript模塊化
因此,ES6語法規范中,在語言層面上定義了ES6模塊化規范,是瀏覽器與服務器通用的模塊化開發規范。
ES6模塊化規范中定義:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
npm install --save @babel/polyfill
項目跟目錄創建文件babel.config.js
babel .config .js 文件內容如右側代碼
通過npx babel-node index.js執行代碼
babel.config.js
默認導出語法
export default 默認導出的成員
默認導入語法
import 接收名稱 from '模塊標識符'
//當前文件模塊為m1.js
//定義私有成員a和c
let a = 10
let c = 20
//外界訪問不到變量d,因為它沒有暴露出去
let d = 30
function show(){}//將模塊中的私有成員暴露出去,供其他模塊使用
export default{a,c,show
}
默認導入語法import 接收名稱 from ‘模塊標識符’
//導入模塊成員
import m1 from './m1.js'
console.log(m1)
//打印輸出結果為:
//{a:10,c:20,show:[Function:show]}
注意:每個模塊中,只允許使用唯一的一次export default,否則會報錯!
實例:
模塊文件 m1.js
let a = 10
let c = 20
let d = 30function show(){console.log('1111111111111')
}// 1. 如果不導出的話,會輸出 空對象{}// 2. 導出模塊 - 只能導出一次
export default {a,c,show
}// 3. 導出2次會報錯 Only one default export allowed per module. (16:0)
// export default {
// a,
// c,
// show
// }
引用模塊文件 index.js
// 導入 m1模塊
import m1 from './m1'
// 使用 m1模塊
console.log(m1)
在終端的運行命令
npx babel-node index.js
按需導出語法export let s1 = 10
//當前文件模塊為m1.js
//向外按需導出變量s1
export let s1 = 'aaa'
//向外按需導出變量s2
export let s2 = 'ccc'
//向外按需導出方法say
export function say = function(){}
按需導入語法 import {s1} from ‘模塊標識符’
//導入模塊成員,可以通過as給導入的成員起別名
import {s1,s2 as ss2,say} from './m1.js'
console.log(s1)//打印出aaa
console.log(ss2)//打印出ccc
console.log(say)//打印出{Function:say}
注意:每個模塊中,可以使用多次按需導出
有時候,我們只想單純執行某個模塊中的代碼,并不需要得到模塊中向外暴露的成員,此時,可以直接導入并執行模塊代碼
//當前文件模塊為m2.js
//在當前模塊中執行一個for循環操作
for(let i = 0;i<3;i++){
console.log(i)
}//直接導入并執行模塊代碼
import './m2.js'
文件依賴關系錯綜復雜
靜態資源請求效率低
模塊化支持不友好
瀏覽器對高級JavaScript特性兼容程度較低
…
webpack是一個流行的前端項目構建工具(打包工具),可以解決當前web開發中所面面臨的困境。
webpack提供了友好的模塊化支持,以及代碼壓縮混淆、處理js兼容問題、性能優化等強大的功能,從而讓程序員把工作的重心放到具體的功能實現上,提高了開發效率和項目的可維護性。
目前絕大多數企業中的前端項目,都是基于webpack進行打包構建的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RIuxn2B4-1612441706181)(img/image-20210123093922182.png)]
1、新建項目空目錄,并運行npm init -y命令,初始化包管理配置文件package.json
2、新建src源代碼目錄
3、新建src->index.html首頁
4、初始化首頁基本的結構
5、運行npm install jquery -s命令,安裝jQuery
6、通過模塊化的形式,實現列表隔行變色效果
1、運行npm install webpack webpack-cli -D命令,安裝webpack相關的包
2、在項目目錄中,創建名為webpack.config.js的webpack配置文件
3、在webpack的配置文件中,初始化如下基本配置:
? webpack.config.js文件(在根目錄中)
module.export = {mode: 'development' // mode用來指定構建模式 (開發階段mode的值為development;產品上線的時候mode的值為 ptoduct)
}
4、在package.json配置文件中的script節點下,新增dev腳本如下:
"script":{"dev":"webpack"//script節點下的腳本,可以通過npm run執行
}
在package.json文件中,加上 “dev”: “webpack”
? 5、在終端中運行npm run dev命令,啟動webpack進行項目打包
打包完以后就可以運行.html文件了,如果項目文件有修改的話,要重新打包在終端中運行npm run dev命令,然后運行項目
列表隔行變色的實例:
index.html文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!-- <script src="./index.js"></script> --><script src="../dist/main.js"></script>
</head>
<body><ul><li>這是第1個li</li><li>這是第2個li</li><li>這是第3個li</li><li>這是第4個li</li><li>這是第5個li</li><li>這是第6個li</li><li>這是第7個li</li><li>這是第8個li</li><li>這是第9個li</li></ul></body>
</html>
index.js 文件 (只打包了.js文件)
import $ from 'jquery'$(function () {// 奇數$('li:odd').css('backgroundColor', 'red')// 偶數$('li:even').css('backgroundColor', 'lightblue')})
1、webpack的4.x版本中默認約定:
2、打包的入口文件為src -> i ndex.js
3、打包的輸出文件為dist -> main.js
4、如果要修改打包的入口與出口,可以在webpack.config.js中增加如下配置信息:
const path = require('path')//導入node.js中專門操作路勁的模塊
module.export = {entry:path.join(_dirname,'./src/index.js'),//打包入口文件的路徑output:{path:path.join(_dirname,'./dist'),//輸出文件的存放路徑filename:'bundle.js'//輸出文件名稱}
}
實例:
const path = require('path')module.exports = {// 編譯模式mode: 'development',/* -------------- 配置打包文件的入口與出口 (要先引入path模塊)--------------- */entry: path.join(__dirname, './src/index.js'), // 打包入口文件的路徑output: {path: path.join(__dirname, './dist'), // 輸出文件的存放路徑filename: 'bundle.js' // 輸出文件的名稱}
}
npm run dev打包
在.index.html文件中,重新導入 打包后的輸出文件:bundle.js
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!-- <script src="./index.js"></script> --><!-- 引入打包(npm run dev)后的輸出文件/dist/main.js --><!-- <script src="../dist/main.js"></script> --><!-- 引入打包(npm run dev)后的輸出文件/dist/bundle.js --><script src="../dist/bundle.js"></script></head>
<body><ul><li>這是第1個li</li><li>這是第2個li</li><li>這是第3個li</li><li>這是第4個li</li><li>這是第5個li</li><li>這是第6個li</li><li>這是第7個li</li><li>這是第8個li</li><li>這是第9個li</li></ul></body>
</html>
運行index.html文件
"scripts":{"dev":"webpack-dev-server"
}
將src -> index.html中,script腳本的引用路徑,修改為"/buldle.js"
運行npm run dev命令,重新進行打包
運行:
在瀏覽器中訪問http://localhost:8080地址,查看自動打包效果
注意:
webpack-dev-server會啟動一個實時打包的http服務器
webpack-dev-server打包生成的輸出文件,默認放到了項目根目錄中,而且是虛擬的、看不見的
作用:打開網址后可以直接看到運行效果,不用再去找運行文件了
配置的步驟:
1、運行npm install html-webpack-plugin -D命令,安裝生成預覽頁面插件
2、修改webpack.config.js文件頭部區域,添加如下配置信息:
//導入生成預覽頁面的插件,得到一個構造函數
const HtmlWebpackPlugin = require('html-webpack-plugin')
//創建插件的實例對象
const htmlPlugin = new HtmlWebpackPlugin({template:'./src/index.html',//指定要用到的模板文件filename:'index.html'//指定生成的文件名稱,該文件存在于內存中,在目錄中不顯示
})
3、修改webpack.config.js文件中向外暴露的配置對象,新增如下配置節點:
module.exports = {plugins:[htmlPlugin]//plugins數組是webpack打包期間會用到的一些插件列表
}
在瀏覽器中輸入 http://localhost:8080/ 就可以看到運行結果了。
在打包npm run dev
后, 會自動打開瀏覽器運行,不需要手動輸入網址。
//package.json中的配置
//--open打包完成后自動打開瀏覽器頁面
//--host配置ip信息
//--port配置端口
"scripts":{"dev":"webpack-dev-server --open --host 127.0.0.1 --port 8888"
},
在實際開發過程中,webpack只能打包處理以.js后綴名結尾的模塊,其它非.js后綴名結尾的模塊,webpack默認處理不了,需要調用loader加載器才可以正常打包,否則會報錯!
loader加載器可以協助webpack打包處理特定的文件模塊,比如:
css、LESS、scss、PostCSS、JavaScript、Image/Font、Vue
//所有第三方文件模塊的匹配規則
module:{rules:[{test:/\.css$/,use:['style-loader','css-loader']} // 順序:style-loader , css-loader 是不能改變的// 先調用 css-loader ,再調用style-loader,把執行結果給webpack]
}
在編輯好css文件后,在index.js(自定義)文件中引入該less文件,然后打包,自動運行
其中,test表示匹配的文件類型,use表示對應要調用的loader
注意:
use數組中指定的loader順序是固定的
多個loader的調用順序是從后往前調用的
1、運行npm i less-loader less -D命令
2、在webpack.config.js的module->rules數組中,添加loader規則如下:
//所有第三方文件模塊的匹配規則
module:{rules:[{test:/\.less$/,use:['style-loader','css-loader','less-loader']}]
}
在編輯好less文件后,在index.js(自定義)文件中引入該less文件,然后打包,自動運行
//所有第三方文件模塊的匹配規則
module:{rules:[{test:/\.scss$/,use:['style-loader','css-loader','sass-loader']}]
}
在編輯好scss文件后,在index.js(自定義)文件中引入該lscss文件,然后打包,自動運行
解決不同瀏覽器中的兼容問題。
1、運行npm i postcss-loader autoprefixer -D命令
2、在項目根目錄中創建postcss的配置文件postcss.config.js,并初始化如下配置:
const autoprefixer = require('autoprefixer')//導入自動添加前綴的插件
module.exports = {plugins:[autoprefixer]//掛載插件
}
3、在webpack.config.js的module->rules數組中,修改css的loader規則如下:
//所有第三方文件模塊的匹配規則
module:{rules:[{test:/\.css$/,use:['style-loader','css-loader','postcss-loader']}]
}
module:{rules:[{test:/\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,use: 'url-loader?limit=11847'// limit用來指定圖片的大小 // 如果limit的值大于或等于圖片大小,會轉為base64圖片;// 如果limit的值小于圖片的大小,會轉為路徑}]
}
其中?之后是loader的參數項。
limit用來指定圖片的大小,單位是字節(byte),只有小于limit大小的圖片,才會被轉為base64圖片。
module.exports = {presets:['@babel/preset-env'],plugins:['@babel/plugin-transform-runtime','@babel/plugin-proposal-class-properties']
}
//exclude為排除項,表示babel-loader不需要處理node_modules中的js文件
{test: /\.js$/, use: 'babel-loader', exclude: /node_modules/}
問題:
全局定義的組件必須保證組件名稱不重復
字符串模板缺乏語法高亮,在HTML有多行的時候,需要用到丑陋的
不支持CSS,意味著當HTML和JavaScript組件化時,CSS明顯被遺漏
沒有構建步驟限制,只能使用HTML和ES5 JavaScript,而不能使用預處理器(如:Babel)
解決方案:
爭對傳統組件問題,Vue提供了一個解決方案——使用Vue單文件組件。
單文件組件的組成結構
示例:
<template>
//這里用于定義Vue組件的模板內容
</template><script>
//這里用于定義Vue組件的業務邏輯
export default{data(){return {}},//私有數據methods:{}//處理函數
//...其他業務邏輯
}
</script>// 組件的私有樣式 scoped
<style scoped>
//這里用于定義組件的私有樣式
</style>
實例 App.vue單文件組件:
<template><div><h1>這是 APP 組件</h1></div>
</template><script>//這里用于定義Vue組件的業務邏輯export default {data() {return {};}, //私有數據methods: {}, //處理函數//...其他業務邏輯};
</script><style scoped>h1 {color: brown;}
</style>
1、運行npm i vue-loader vue-template-compiler -D命令
2、在webpack.config.js配置文件中,添加vue-loader的配置項如下:
const VueLoaderPlugin = require('vue-loader/lib/plugin')module.export = {plugins:[//...其他插件new VueLoaderPluign()//請確保引入這個插件],module:{rules:[//...其他規則{test:/\.vue$/,use:'vue-loader'}]}}
1、運行npm i vue -S安裝vue
2、在src->index.js入口文件中,通過import Vue from 'vue’來導入vue構造函數
3、創建vue的實例對象,并指定要控制的el區域
4、通過render函數渲染App根組件
示例:
//1、導入Vue構造函數
import Vue from 'vue'
//2、導入App根組件
import App from './components/App.vue'const vm = new Vue({//3、指定vm實例要控制的頁面區域el:'#app',//4、通過render函數,把指定的組件渲染到el區域中render:h=>h(App)
})
上線之前需要通過webpack將應用進行整體打包,可以通過package.json文件配置打包命令:
//在package.json文件中配置webpack打包命令
//該命令默認加載項目根目錄中的webpack.config.js配置文件
"scripts":{//用于打包的命令"build":"webpack -p",//用于開發調試的命令"dev":"webpack-dev-server --open --host 127.0.0.1 --port 3000",
},
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态