使用Vue2.X和Webpack2.X開發SPA應用 - 環境構建篇

一、開發環境準備

1.1 安裝nodejs

首先安裝Nodejs,直接去nodejs官網下載https://nodejs.org/en/,默認會安裝Npm,因此這裏能夠不用單獨安裝。css

1.2 使用淘寶Npm鏡像

因爲國內網絡緣由,若是直接使用Npm安裝依賴包會由於網絡和牆的緣由致使不成功,好在淘寶給我提供了能夠使用的鏡像,地址是:https://npm.taobao.org/,按照其【使用說明】將鏡像安裝好html

1.3 IDE準備

目前前端開發比較火的IDE是Jetbrain的WebStorm,到其官網下載:http://www.jetbrains.com/webstorm/,安裝後有30天的試用期,若是以爲不爽,能夠去網上找破解,這裏把我使用的註冊信息放出來。固然最好的是付費啦前端

2.搭建Webpack工程

2.1 新建工程

當開發環境準備好後,就能夠打開WebStorm,新建一個空項目,以下圖:java

使用webstorm的好處不少,其中之一就是能夠直接在IDE裏面調出控制檯,以下圖:node

在控制檯輸入「npm init」初始化這個工程,控制檯會讓你輸入以下信息,這裏能夠默認都回車,最後按照提示輸入"yes"則初始化完成。webpack

這時在工程根目錄下會生成package.json,打開文件能看到剛纔在控制檯輸入的信息,以下:git

package.json文件是Nodejs和Npm查找依賴的清單,更多的信息能夠參考這篇文檔:https://docs.npmjs.com/files/package.json和http://www.ruanyifeng.com/blog/2016/10/npm_scripts.htmles6

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/github

使用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能夠看到效果:

三、進階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"。

相關文章
相關標籤/搜索