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

来源:http://www.cnblogs.com/jaypeng/archive/2017/07/10/7147091.html
-Advertisement-
Play Games

[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"。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前寫過在windows環境上部署rabbitmq,這回介紹在centos上對這個消息中間件進行部署的過程 一 下載和解壓 wget http://www.rabbitmq.com/releases/rabbitmq-server/current/rabbitmq-server_3.6.10-1.d ...
  • // test07.cpp : Defines the entry point for the console application.// #include "stdafx.h"//設計模式第7章 適配器模式 class Duck{public: virtual void quack() = 0; ...
  • 創建資料庫(y2165) MyBatis環境搭建1.在pom.xml引入依賴2.得替換build節點,為了讓程式編譯在main中所有子包下的配置文件3.構建大配置,位於resources<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configura ...
  • ngrx 是 Angular框架的狀態容器,提供可預測化的狀態管理。 1.首先創建一個可路由訪問的模塊 這裡命名為:DemopetModule。 包括文件:demopet.html、demopet.scss、demopet.component.ts、demopet.routes.ts、demopet ...
  • 現在,組件化開發還是比較流行的,畢竟其優點相當突出。最近在開發一個組件的時候,遇到了一個很有意思的BUG。。。 BUG的背景 最近在開發一個組件,好不容易開發好了轉測試。然後,測試給我提了一個這樣的bug,orz... 因為是一個組件,最大的好處就是可以隨處復用,隨處使用,然而,當一個頁面用了多個組 ...
  • let / var 可以重覆聲明 let 有塊級作用域 沒有前置功能 不能重覆聲明 / var a=1; console.log(a);//1 let b=2; console.log(b);//2 if(a==1){ var z=2; } console.log(z);//2 / if(a1==1 ...
  • ES6 scope(作用域) 作用域 : 1.全局作用域(global) 2.函數作用域(function) 全局作用域 var a=1; console.log(a);//1 //{}表示語句塊 if(a==1){ var b=2; console.log(b);//2 } console.log ...
  • js中var、let、const的區別 主要內容是:js中三種定義變數的方式const, var, let的區別。 var定義的變數可以修改,如果不初始化會輸出undefined,不會報錯。 var分為兩種:局部作用域和函數作用域 let是塊級作用域,函數內部使用let定義後,對函數外部無影響。 l ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...