在當前grunt、gulp、webpack成爲平常工具的狀況下,若是你還只是熟練的使用html、css和激塊瑞的話,已經遠遠不能知足項目的需求,因此你得變強,你須要懂得更多。如今前端不只僅是用那幾句蹩腳的JavaScript代碼在瀏覽器渲染幾個頁面而後提交幾個表單在寫點交互了。如今WebGL協議能夠爲HTML5 Canvas提供硬件3D加速渲染,你能夠用JavaScript語法能夠渲染3D模型,你也能夠用nodejs搭建後臺,還能夠用react-native、weex作一個app。js發展的也愈來愈像後臺語言,畢竟js已經將它的魔爪伸到了不少領域,這讓你能夠猥瑣欲爲。。。確實每一個前端都應該有一統前端界的野心,寄人籬下只是暫時的 ⌒_⌒....javascript
webpack是現代JavaScript應用程序的靜態模塊打包工具
,webpack是經過npm來安裝的,npm是跟node一塊兒下載的包管理工具,因此你得保證電腦上已經安裝了node。在安裝以前先來講下cnpm,由於npm安裝插件是從國外服務器下載,受網絡影響大,可能出現異常,那下載速度讓人不禁得喊一聲「王德發」,因此咱們‘偉大的’淘寶團隊幹了一件偉大的事:「這是一個完整 npmjs.org 鏡像,你能夠用此代替官方版本(只讀),同步頻率目前爲 10分鐘 一次以保證儘可能與官方服務同步。」 你只要執行如下命令:css
$ npm install -g cnpm
用了cnpm以後那速度讓人爽得不要不要的,不再用擔憂摔鍵盤的問題了。html
那麼下面就來介紹一下webpack的安裝,安裝包括本地安裝和全局安裝(我用的是webpack4版本):前端
全局安裝(全局安裝是安裝到你C盤裏,在任何地方均可以使用):java
cnpm i webpack -g
本地安裝(是安裝到當前目錄,只能在當前目錄使用):node
cnpm i webpack -D //i 是install 的縮寫
若是你想安裝webpack特定的版本,好比說2.2:react
cnpm i webpack@2.2 -D
在之前的版本中webpack和webpack-cli是一體的,但在webpack4中,它把webpack和它的cli分開來以方便於管理,因此還須要安裝:webpack
cnpm i webpack-cli -D
到這裏咱們已經懷着美滋滋的心情介紹完webpack的安裝方法了,如今介紹一下webpack的基本概念,它的基本概念有四個,是的只有四個,你沒有看錯(是否是很高興?你高興的太早了):git
entry:顧名思義就是入口,就好像一個口袋的袋口,要裝東西(好比說一支筆)進去就要經過這裏。github
output:確定就是出口啦,你把一個裝筆的袋子拿繩子捆起來後放到一個地方,這個地方就是出口。
loader:這個單詞的意思是裝貨的人
,那麼在這裏就是指的是那個裝筆的人,意思是由於筆不可能本身跑進袋子裏,須要一我的代勞。其實正確的解釋是webpack自身只能理解javascript,它不認識這支筆是什麼東西,因此就須要loader告訴webpack這是一支筆,那麼webpack就能理解這支筆了。
plugins:這個就是插件,咱們對插件確定很熟悉了,在項目中咱們用過不少各類各樣的插件,它能夠用來處理各類各樣的任務。
介紹完了webpack的安裝以及概念,讓咱們釋放一下蠢蠢欲動的心作一個小項目吧:
mkdir webpack_lesson_one
cd webpack_lesson_one
npm init -y
cnpm i webpack webpack-cli -D
index.html
和一個webpack的配置文件webpack.config.js
以及一個資源文件夾src
,完成以上流程之後咱們的目錄應該是這個樣子的:
src
目錄裏面新建一個入口文件index.js
,而後編輯文件如圖:
webpack.config.js
:const path = require('path'); module.exports = { entry:{ //入口文件配置,固然這裏能夠配置多個入口文件,在此對象內增長增長鍵值對便可 app: './src/index.js' }, output:{ //出口文件配置 filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') } } //path.resolve()是nodejs中的語法,拼接路徑, __dirname表明項目根目錄
"scripts"
命令,以下:
接下來在根目錄的index.html
中引入app.bundle.js
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="dist/app.bundle.js"></script> </body> </html>
npm run build
接下來就是見證奇蹟的時刻了,你的項目根目錄會生成dist
文件夾,瀏覽器運行index.html
就會看到hello world!
,那麼咱們的一個超級森破的項目就這樣完成了。
在介紹上面幾個功能前先說一下項目目錄的合理分配,一個合適的項目目錄能夠下降總體項目的依賴性,大大提升工做中的開發效率,因此資源管理必定作好。那麼在src
目錄中新建components
目錄,而後新建文件以下:
|- /src |- |- /components |- | |- /News |- | |- |- /img |- | |- |- index.js |- | |- |- style.css |- index.js
style-loader
和css-loader
以及file-loader
:cnpm i style-loader css-loader file-loader -D
webpack.config.js
中配置:const path = require('path'); module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] //這裏須要注意下,style-loader 必需要寫在 css-loader 以前喲 }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', //能夠重寫css中引入圖片部分 publicPath: 'dist/' //能夠從新生成圖片到新的目錄 } } ] } ] } }
咱們來修改src
目錄下的index.js
編寫News
目錄下的style.css
文件
body{ background: #fff url(img/banben.png) 0 0 no-repeat; }
編寫News
目錄下的index.js
文件
import './style.css'; console.log('有一天我但願站在這個世界的頂端說出八個大字:個人,個人,都是個人!');
如今你再運行npm run build
命令,再運行index.html
看看是否是這樣的效果(啊,多麼漂亮的圖標啊!):
再看看裏面加載的css:
圖片後面自動加上了參數,這就是上面的配置項name:'img/'+'[name].[ext]?[hash]'
的做用。你能夠去看看file-loader的使用方法,讓咱們姿式一塊兒漲,1(yao)3(san)一塊兒裝。
webpack.config.js
文件:const path = require('path'); module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] //這裏須要注意下,style-loader 必需要寫在 css-loader 以前喲 }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', //能夠重寫css中引入圖片部分 publicPath: 'dist/' //能夠從新生成圖片到新的目錄 } } ] }, { test:/\.(woff|woff2|eot|otf|ttf)$/, use:['file-loader'] } ] } }
src
目錄下新建public
文件夾,放入字體文件資源:
src
目錄下的index.js
引入字體css文件:
index.html
中添加字體標籤:
再去News
裏改變一下字體的大小,作人就是要大氣一些:
而後再npm run build
一下看看字體圖標已經加載出來了!!!
咱們已經能加載圖片了,那麼試着壓縮一下吧,畢竟濃縮的纔是精華、O(∩_∩)O哈哈~。。另附直通車image-webpack-loader,一條龍式服務必須滴。
仍是老樣子,固然仍是先安裝image-webpack-loader
cnpm i image-webpack-loader -D
修改webpack.config.js
module裏的rules:
module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[name].[ext]?[hash]', publicPath: 'dist/' } }, { //壓縮圖片要在file-loader以後使用 loader:'image-webpack-loader', options:{ bypassOnDebug: true } } ] }, { test:/\.(woff|woff2|eot|ttf|otf)$/, use:['file-loader'] } ] },
如今你npm run build
以後看看dist
文件夾內的banben.png
和以前的圖片大小對比,是否是小了一半,就是這麼方便。
file-loader
裏的name
參數變一下:{ loader:'file-loader', options:{ name:'img/'+'[hash].[ext]', //把[name] 換成 [hash] publicPath: 'dist/' } }
這樣咱們生成的文件是一個以哈希值命名的圖片,當咱們改變原圖片名字的時候再打包後會從新生成一個圖片文件,可是以前生成的依然還在那裏一動不動。這個時候咱們就須要用到clean-webpack-plugin了,固然這個是插件
不是loader
喲~ 那就讓咱們來安裝吧:
cnpm i clean-webpack-plugin -D
webpack.config.js
const path = require('path'); const CleanWebpackPlugin = require('clean-webpack-plugin'); //插件是須要引入的,這裏可別忘了引入 module.exports = { entry:{ app: './src/index.js' }, output:{ filename:'[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module:{ rules:[ { test:/\.css$/, use:['style-loader', 'css-loader'] }, { test:/\.(jpg|png|gif|svg)$/, use:[ { loader:'file-loader', options:{ name:'img/'+'[hash].[ext]', publicPath: 'dist/' } }, { loader:'image-webpack-loader', options:{ bypassOnDebug: true } } ] }, { test:/\.(woff|woff2|eot|ttf|otf)$/, use:['file-loader'] } ] }, plugins:[ new CleanWebpackPlugin(['dist/img']) //數組內的是須要清理的目錄 ] }
來來來,咱們npm run build
一下,是否是你的img
文件消失一下後又從新浮如今你的眼前了,若是沒有消失過多是你的眼花了。
固然你還能夠設置其它參數,詳見clean-webpack-plugin
plugins:[ new CleanWebpackPlugin(['dist/img'],{ exclude: [ 'banben.png' ] //這個配置意思就是不刪除 img 文件裏面的 banben.png 圖片 }) ]
如今本期webpack筆記已經到此結束了,另附上github項目練習素材地址:https://github.com/zgf123/web...
webpack遵循commonJs規範,每一個文件就是一個模塊,有本身的做用域。在一個文件裏面定義的變量、函數、類,都是私有的,對其餘文件不可見。CommonJS規範規定,每一個模塊內部,module變量表明當前模塊。這個變量就是一個對象,它的exports屬性就是對外的接口,所謂加載某個模塊,其實就是加載這個模塊的modules.exports屬性。