大家好,我是狗蛋~
平時寫項目都是用腳手架,對于webpack真的是一概不知~
前幾天在慕課學(xué)習(xí)《webpack深入與實戰(zhàn)》,發(fā)現(xiàn)這個真的的從零開始學(xué)習(xí),而且是1.X版本的webpack,很適合我這種小白,因為我是最近學(xué)習(xí),所以用的是4.6版本的,所以我會用4.6的版本翻轉(zhuǎn)。
我會把作者的描述寫進來,該篇就當做是視頻的筆記版與我的遇坑記錄。
webpack是給js的打包工具,可以把很多的模塊打包成很少的一些靜態(tài)文件,它有自己的一個特性——代碼分割(Code Splitting),代碼分割可以使項目加載過程中只去當時需要的那部分文件,webpack整個工具里面有一個loader的概念,模塊可以通過loader去處理各種各樣的文件,無論文件是commonjs還是AMD還是es6,模塊化方式寫的,都可以通過loader處理,甚至可以處理css文件、圖片文件、js文件、coffeescript文件,less文件,甚至自定義文件(.vue,.jsx)
2018.04.20更新。
找到一篇webpack2.X的與視頻內(nèi)容類似的文章
webpack實用配置
接下來在demo01文件夾操作
npm init // 初始化npm
npm install webpack -D // 本地安裝webpack
新建一個hello.js
function hello(str){
alert(str);
}
然后打包hello.js
webpack hello.js hello.bundle.js // hello.js要打包的文件 hello.bundle.js打包后生成的文件
突發(fā)情況:這里打包我出了問題,他說我'webpack' 不是內(nèi)部或外部命令
百度了一下,webpack不是內(nèi)部命令有兩種解決方法
- 先全局安裝,再在自己工作目錄安裝使用(不推薦)
- 在package.json中添加script,就可以用npm run name執(zhí)行webpack命令了,name可以任?。ㄍ扑])
所以我在package.json的script屬性加了一行"start": "webpack",然后命令行輸入npm run start,然后爆問題。

在webpack 3中,webpack本身和CLI都在同一個包中,但是在版本4中,他們將兩者分開來更好地管理它們。
所以我要say yes,本地裝webpack-cli,裝好之后又報問題,黃色警告是要在語句中加模式,如圖我寫的。至于紅色的字,算了,加配置文件吧!

webpack.config.js
module.exports = {
entry: './hello.js',
output: {
filename: 'bundle.js'
}
}
然后運行npm run start,成功了

打包成功之后會給出信息
Hash: 本次打包哈希值
Version: webpack版本
Time: 本次打包所花時間
Asset: 生成的文件
Size: 生成的文件大小
Chunks: 這次打包的分塊
Chunk Names: 這次打包的塊名稱
在生成的dist文件夾中的bundle.js打開,拉到最下面可以看到我們寫的hello.js的東西,變樣了,哈哈哈

demo02新開一個文件夾,使hello.js引用別的js文件
新建一個world.js
function world(){
return {}
}
在hello.js引用world.js
require('./world.js');
function hello(str){
alert(str);
}
然后運行npm run start,成功了


并沒有視頻中說的[0],[1]模塊表示出來....
demo03 webpack怎么處理css文件
不要覺得奇怪,演示而已,你就當做歷史過程吧。。。
新建一個style.css
body {
background: lightskyblue;
}
在hello.js引用style.css
require('./world.js');
require('./style.css');
function hello(str){
alert(str);
}
然后運行npm run start,按照視頻所說的,會報錯,好的,如愿報錯~

你需要一個適當?shù)膌oader處理css文件,好的,在目錄下(本地)安裝這個loader
npm install css-loader style-loader -D
并且給相應(yīng)的文件指定的loader require('css-loader!./style.css'); 全部代碼如下:
// hello.js
require('./world.js');
require('css-loader!./style.css');
function hello(str){
alert(str);
}
然后運行npm run start,成功~

demo04創(chuàng)建一個index.html更直觀的看到css的效果
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>webpack test</title>
</head>
<body>
<script src="./dist/bundle.js"></script> // 這里因為我們是另外新建的html來引入生成后的js,所以是雙擊打開html文件查看效果
</body>
</html>
hello.js
require('./world.js');
require('css-loader!./style.css');
function hello(str){
alert(str);
}
hello('hello world!');
然后npm run start,成功~雙擊打開html文件查看效果

少了style-loader處理文件了,css-loader是處理css文件,style-loader是處理css-loader處理完的文件,新建style標簽插入html文件。所以,要改一下
// hello.js
require('./world.js');
require('style-loader!css-loader!./style.css');
function hello(str){
alert(str);
}
hello('hello world!');
然后npm run start,成功~

除了在文件中引用css時,加入loader,也可以在命令行加入loader,但是真正開發(fā)不會這樣做的,我這里就不演示了....
明晚或后晚再演示一整個小項目那種~
2018.04.21 更~
demo05 建立項目
在demo05文件夾中創(chuàng)建文件夾,然后初始化npm,本地安裝webpack、webpack-cli,項目標配~
npm init
npm install webpack webpack-cli -D
新建文件夾src(放代碼)、dist(放打包后生成文件)以及初始化頁面index.html
再在src文件夾中創(chuàng)建script(放腳本)與style(放樣式)文件夾
創(chuàng)建webpack.config.js
我們之所以在項目下建立一個webpack配置文件是因為我們直接使用webpack命令,webpack會在根目錄下直接找到webpack.config.js,把它當做默認配置去運行
編輯webpack.config.js
module.exports = { // commonjs的模塊化輸出
entry: './src/script/main.js', // 打包入口從哪開始 相對路徑
output: { // 打包以后的文件放什么地方
path: __dirname + '/dist/js', // 之前定義好的dist文件下的js文件夾 絕對路徑
filename: 'bundle.js', // 打包以后的文件名叫什么
}
}
在script文件夾下新建main.js
編輯main.js
function helloworld(){}
在命令行輸入webpack

那我在package.json里的script屬性寫命令了
編輯package.json,該文件不能有注釋
{
"name": "demo05",
"version": "1.0.0",
"scripts": {
"dev": "webpack --mode development", // 沒有寫模式webpack4.6會出警告
"build": "webpack --mode production" // 沒有寫模式webpack4.6會出警告
},
"license": "ISC",
"devDependencies": {
"webpack": "^4.6.0",
"webpack-cli": "^2.0.15"
}
}

在dist/js文件夾下可以看到bundle.js,還壓縮了
如果把webpack.config.js命名為webpack.dev.config.js,執(zhí)行的webpack命令是webpack --config webpack.dev.confit.js,因為默認的是webpack.config.js,否則會報錯。

視頻里講到webpack的命令參數(shù),--progress顯示進度,--display-modules顯示打包模塊,--colors顯示信息有顏色,--display-reason打包原因,4.6版本除了沒有顯示進度,其他都沒什么效果。所以就不演示了。
在nodejs中也可以使用webpack,直接把webpack配置作為一個對象傳給webpack。日常中很可能用nodejs寫工具,在工具里面調(diào)用webpack,就會用到這種方式。這塊內(nèi)容后面會談到。
webpack.config.js配置講解
-
entry
webpack打包入口指示,有三種輸入方式來匹配不同需求- (1) string,指定一個入口文件,所有的依賴都在這個入口文件指定
- (2) 數(shù)組,為了解決多個互不依賴的文件打包在一起,例如
entry: ['./src/script/main.js','./src/script/a.js'] - (3) 對象,key表示chunk name,value表示真的的一個入口,value既可以是string,也可以是數(shù)組。使用場景是在多頁面應(yīng)用,根據(jù)page1、page2給不同頁面不同的chunk,page1入口是main.js,page2入口是a.js。例如:
entry: { "page1": './src/script/main.js', "page2": ['./src/script/a.js'], // 打包入口從哪開始 相對路徑 }
-
output
官網(wǎng)中指明不要在filename中使用絕對路徑,因為path會真正指定路徑。如果entry是單文件,那么filename就是可以寫死,如bundle.js。如果entry是多入口,filename還是寫死一個文件,那會造成覆蓋,只生成一個文件。所以需要占位符保證輸出是唯一的,如[name]表示chunkname,entry表示作為對象時的key、[hash]是這次打包的hash、[chunkhash]是每一個chunk的hash。demo06作為該例子。// webpack.config.js module.exports = { // commonjs的模塊化輸出 entry: { "main": './src/script/main.js', "a": ['./src/script/a.js'], // 打包入口從哪開始 相對路徑 }, output: { // 打包以后的文件放什么地方 path: __dirname + '/dist/js', // 之前定義好的dist文件下的js文件夾 絕對路徑 filename: '[name].[hash:6].js', // 打包以后的文件名叫什么 } }
demo07 自動化生成項目中的html頁面
我們打包之后的js要在html里引用,但是我們不可能每次打包就手動改一次,為解決這個問題,我們可以使用html-webpack-plugin插件。
本地安裝插件npm install html-webpack-plugin -D
這個插件的介紹,也有中文的詳細介紹

