[TOC] 1、開發環境準備 1.1 安裝nodejs 首先安裝Nodejs,直接去nodejs官網下載https://nodejs.org/en/,預設會安裝Npm,所以這裡可以不用單獨安裝。 1.2 使用淘寶Npm鏡像 由於國內網路原因,如果直接使用Npm安裝依賴包會因為網路和牆的原因導致不成功 ...
[TOC]
1、開發環境準備
1.1 安裝nodejs
首先安裝Nodejs,直接去nodejs官網下載https://nodejs.org/en/,預設會安裝Npm,所以這裡可以不用單獨安裝。
1.2 使用淘寶Npm鏡像
由於國內網路原因,如果直接使用Npm安裝依賴包會因為網路和牆的原因導致不成功,好在淘寶給我提供了可以使用的鏡像,地址是:https://npm.taobao.org/,按照其【使用說明】將鏡像安裝好。
1.3 IDE準備
目前前端開發比較火的IDE是Jetbrain的WebStorm,到其官網下載:http://www.jetbrains.com/webstorm/,安裝後有30天的試用期,如果覺得不爽,可以去網上找破解,這裡把我使用的註冊信息放出來。當然最好的是付費啦
2.搭建Webpack工程
2.1 新建工程
當開發環境準備好後,就可以打開WebStorm,新建一個空項目,如下圖:
使用webstorm的好處很多,其中之一就是可以直接在IDE裡面調出控制台,如下圖:
在控制台輸入“npm init”初始化這個工程,控制台會讓你輸入如下信息,這裡可以預設都回車,最後按照提示輸入"yes"則初始化完成。
這時在工程根目錄下會生成package.json,打開文件能看到剛纔在控制台輸入的信息,如下:
package.json文件是Nodejs和Npm查找依賴的清單,更多的信息可以參考這篇文檔:https://docs.npmjs.com/files/package.json和http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html
2.2 安裝Webpack
關於Webpack的概念和作用可以參考這篇博文:https://llp0574.github.io/2016/11/29/getting-started-with-webpack2/?utm_source=tuicool&utm_medium=referral和
http://www.jianshu.com/p/42e11515c10f。英語好的童鞋可以直接參看官網:http://webpack.github.io/
使用webpack的目的是讓代碼更模塊化,方便維護和管理,這和在Java中用maven來管理包很相似。
2.2.1 安裝
首先,在控制台輸入命令:npm install webpack,這個命令的作用是讓npm安裝webpack到node_modules(該目錄會自動生成)下。
- 在產品環境中,以在命令後加上--save,比如:npm install webpack --save,這個意思是說把webpack安裝到node_modules下,並且更新package.json文件的dependencies。
- 在開發環境中,我們使用:npm install webpack --save-dev,將webpack安裝到Node_modules下,並且更新package.json的devDependencies。
這裡我們使用在開發環境中的命令。
更多的NPM命令可以參看官網:https://docs.npmjs.com/和http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html
2.2.2 配置
1.首先,我們再工程目錄下新建src目錄,併在src下新建hello.js文件,文件內寫如下代碼:
export default function () {
const hello = document.createElement("div");
hello.textContent = "Hello Webpack!"
return hello;
}
這是按照ES6的語法來實現。
關於ES6的更多內容可以參考這篇文檔:http://es6.ruanyifeng.com/#README。
export是定義對外暴露的介面,default是為export提供一個預設輸出,這樣可以在import的時候自定義變數名而不用在import的時候指定export中的變數名。所以這段代碼意思是:預設輸入一個匿名函數。
2.然後,在hello.js同級下創建main.js,然後輸入如下內容:
import Hello from "./hello";
document.getElementById("app").appendChild(Hello());
import是將剛纔所寫的hello.js文件當做一個模塊導入進來,"Hello"變數就是為這個匿名函數定義變數名,from後面就是被引入的文件地址,如果是js文件預設不用寫,該路徑可以是相對路徑或者絕對路徑,然後用js去從dom獲取app節點,並添加子級元素。
3.在工程根目錄新建public文件夾,並新建一個Index.html文件,如下:
然後在Html文件中創建一個div,其id為app,併在body尾處引入script,如下圖:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
<body>
<div id="app" ></div>
<script type="text/javascript" src="bundle.js"></script></body>
</html>
4.在工程目錄下新建webpack.config.js文件,編輯webpack.config.js文件,編寫如下代碼:
module.exports = {
entry: __dirname + "/src/main.js",
output: {
path: __dirname + "/public",
filename: "bundle.js"
}
}
__dirname是nodejs中的全局變數,指向當前執行腳本的目錄。
module.exports是webpack的對象,其中entry是指定入口文件,這裡指定main.js為入口文件。output下的path是輸出目錄,filename是輸出文件名稱。通過path和filename組合就可以將我們再代碼中引入的模塊完整的輸出到制定的文件中。
5.在控制台執行webpack命令,就可以看到bundle.js文件已經輸出到Public目錄下了
這個時候通過瀏覽器打開Index.html可以看到效果:
3、進階Webpack
上面我們已經可以用webpack來打包我們的模塊,不過這隻是剛入門,後面我們會不斷的完善webpack.config.js這個文件。
從剛纔的例子中,我們需要自己手動的在html頁面裡面引入bundle.js文件,那麼有沒有自動幫我們引入文件的功能呢?回答肯定是有的,這裡就介紹下Html-webpack-plugin插件。
3.1 常用插件
3.1.1 Html-webpack-plugin插件
插件官方地址是:https://www.npmjs.com/package/html-webpack-plugin,這裡只是簡單講解使用。
1.要使用html插件,首先需要在項目中引入該模塊,在控制台執行命令:
npm install html-webpack-plugin --save-dev
2.編輯webpack.config.js文件,在其中加入以下代碼:
var HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: __dirname + "/src/main.js",
output: {
path: __dirname + "/public",
filename: "bundle.js"
},
plugins: [
new HtmlWebpackPlugin()
]
}
可以看到,使用require引入html-webpack-plugin,然後在配置中的plugins數組中new一個插件對象。
3.這個時候我們把public目錄刪除,再在控制台執行webpack命令,會看到如下:
註意看紅框部分,首先,title已經被修改了插件預設值;其次,id為app的div已經沒有了。最後,可看到在body末尾插件幫我們把bundle.js插入。
template屬性
看插件官網,插件有一個template屬性,可以指定模板文件,插件能按照模板幫我們插入js或者css引用。
官網地址是:https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md。
看官網描述,預設會有一個ejs的loader會解析模板,至於ejs是什麼?ejs是一個模板語言,在nodejs開發中經常會用到,這裡可以把ejs完全當做一個html格式來用。
所以,在src目錄下,我們新建一個index.temp.ejs文件,並把public下的index.html的內容拷貝到該文件中,並修改至如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
<body>
<div id="app" class="custom"></div>
</body>
</html>
可以看到,title已經被我們修改回webpack example了,並且也添加了id為app的div,還刪除了script,接著,刪除Public下的文件。然後我們再控制台輸入webpack,等webpack打包編譯完成,這時public下生成了bundle.js和index.html文件,編輯index.html文件,可以看到如下信息:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
<link href="styles.css" rel="stylesheet"></head>
<body>
<div id="app" class="custom"></div>
<script type="text/javascript" src="bundle.js"></script></body>
</html>
在Body末尾,插件自動給我們把script加上了。
3.1.2 Extract-text-webpack插件
如果我們也想把css文件也自動插入,那麼就會用到extract-text-webpack插件。
其官網地址是:https://github.com/webpack-contrib/extract-text-webpack-plugin。
官網的usage如下:
const ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
},
plugins: [
new ExtractTextPlugin("styles.css"),
]
}
1.首先還是要先在控制台輸入命令:
npm install extract-text-webpack-plugin --save-dev。
這裡要註意:官網只提示安裝extract插件,其實在編譯的時候,還需要style-loader和css-loader,所以還要執行命令:
npm install style-loader --save-dev
npm install css-loader --save-dev
2.然後在webpack.config.js文件上面,require一下這個插件
3.按照官網的用法,編寫module節點,最後如下所示:
var HtmlWebpackPlugin = require("html-webpack-plugin");
var ExtractTextWebpackPlugin = require("extract-text-webpack-plugin");
module.exports = {
entry: __dirname + "/src/main.js",
output: {
path: __dirname + "/public",
filename: "bundle.js"
},
module: {
rules: [{
test: /\.css$/,
use: ExtractTextWebpackPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}]
},
plugins: [
new HtmlWebpackPlugin({
template: "./src/index.temp.ejs"
}),
new ExtractTextWebpackPlugin("styles.css")
]
}
註意:
- test是正則表達式,不是字元串!!!,沒有引號
- 在webpack2中,module下的loaders改為rules,後者擁有更多的功能
4.接著,我們在src目錄下新建一個index.css文件,並編輯編寫如下樣式:
.custom{
font-size: 18px;
color: bisque;
border: 1px moccasin solid;
padding: 5px;
}
5.然後,編輯index.temp.ejs文件,在div標簽加入class="custom",如下圖紅框處:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
</head>
<body>
<div id="app" class="custom"></div>
</body>
</html>
6.編輯main.js文件,在其頂部Import剛纔新建的index.css文件,如下圖:
import Hello from "./hello";
import IndexStyle from "./index.css";
document.getElementById("app").appendChild(Hello());
7.最後,在控制台輸入命令
webpack
編譯完成後,可以看到public目錄下生成了style.css文件,編輯index.html文件,可以看到在Head中引入了Style.css文件,如下圖:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
<link href="styles.css" rel="stylesheet"></head>
<body>
<div id="app" class="custom"></div>
<script type="text/javascript" src="bundle.js"></script></body>
</html>
3.2 開發伺服器 - Webpack-dev-server
在開發中,我們會不斷的調試頁面和參數,如果每次都是執行webpack命令未免太累了,所以這裡介紹一個開發伺服器webpack-dev-server,它提供一個易於部署的伺服器環境,並且具有實時重載的功能。
更多的文檔可以參考:http://www.css88.com/doc/webpack2/guides/development/。
要使用這個功能,首先還先執行npm的安裝命令
npm install webpack-dev-server --save-dev,
執行完成後,編輯package.json文件,添加"start"代碼如下:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start":"webpack-dev-server --progress"
}
"--progress"參數可以查看當前執行進度,在控制台輸入"npm start"控制台會列印日誌信息,最後出現編譯成功,代表服務啟動完成,這時打開http://localhost:8080,可以看到index.html的內容,如下圖:
這個時候,編輯hello.js,添加一些字元串如下:
export default function () {
const hello = document.createElement("div");
hello.textContent = "Hello Webpack!This is my example!"
return hello;
}
保存後,打開瀏覽器不用刷新,就可以看到我們新添加的"This is my example"。