webpack開發(fā)配置

image.png

安裝

作為項(xiàng)目依賴安裝

npm install --save-dev webpack@3.5.5

最新版本bug太多,這里我們指定3.5.5版本

window下若出現(xiàn)問題(Cannot find module 'webpack/lib/node/NodeTemplatePlugin”),則在命令行窗口輸入npm config get prefix,會(huì)得到輸出路徑捕虽,添加至環(huán)境變量即可
鍵:NODE-PATH 值:F:\Program Files\nodejs\node_modules

總覽

官網(wǎng)對(duì)webpack的定義是MODULE BUNDLER晦鞋,他的目的就是把有依賴關(guān)系的各種文件打包成一系列的靜態(tài)資源。 請(qǐng)看下圖

image.png

webpack簡(jiǎn)單點(diǎn)來說就就是一個(gè)配置文件,所有的魔力都是在這一個(gè)文件中發(fā)生的艺配。 這個(gè)配置文件主要分為三大塊

  • entry 入口文件 讓webpack用哪個(gè)文件作為項(xiàng)目的入口
  • output 出口 讓webpack把處理完成的文件放在哪里
  • module 模塊 要用什么不同的模塊來處理各種類型的文件

下面我們就一步一步來新建一個(gè)簡(jiǎn)單的項(xiàng)目

建立項(xiàng)目

建一個(gè)文件夾钢猛,然后新建一個(gè)package.json的文件在項(xiàng)目根目錄下

mkdir webpack
cd webpack
npm init
# 一直點(diǎn)回車 如果懶得填一些信息

項(xiàng)目結(jié)構(gòu)

/app
  -  index.js
  -  sub.js
package.json
webpack.config.js

添加了兩個(gè)js文件伙菜,添加了最重要的webpack的配置文件,我們還是從非常簡(jiǎn)單的hello world開始玩起命迈,webpack原生直接支持AMD和CommonJS兩種格式贩绕,如果你想使用ES6的風(fēng)格火的,這點(diǎn)以后再提。

JS代碼

sub.js

//我們這里使用CommonJS的風(fēng)格
function generateText() {
  var element = document.createElement('h2');
  element.innerHTML = "Hello h2 world";
  return element;
}

module.exports = generateText;

index.js

var sub = require('./sub');
var app  = document.createElement('div');
app.innerHTML = '<h1>Hello World</h1>';
app.appendChild(sub());
document.body.appendChild(app);

代碼寫完了淑倾,完成一個(gè)很簡(jiǎn)單的功能馏鹤,新建一個(gè)單獨(dú)的module,并且在另外一個(gè)module里面引用他娇哆,最后會(huì)在頁面里面輸出兩個(gè)標(biāo)題湃累。

配置Webpack

現(xiàn)在開始配置webpack,目標(biāo)是把這兩個(gè)js文件合并成一個(gè)文件. 我們可以自己在build文件夾里面手動(dòng)建一個(gè)index.html文件夾迂尝,然后再把合并以后的js引用在里面脱茉,但是這樣有些麻煩,所以我們這里安裝一個(gè)plugin垄开,可以自動(dòng)快速的幫我們生成HTML琴许。

npm install html-webpack-plugin --save-dev

好 有了這個(gè)插件 開始寫config文件

var path = require('path');
var HtmlwebpackPlugin = require('html-webpack-plugin');
//定義了一些文件夾的路徑
var ROOT_PATH = path.resolve(__dirname);
var APP_PATH = path.resolve(ROOT_PATH, 'app');
var BUILD_PATH = path.resolve(ROOT_PATH, 'build');

module.exports = {
  //項(xiàng)目的文件夾 可以直接用文件夾名稱 默認(rèn)會(huì)找index.js 也可以確定是哪個(gè)文件名字
  entry: APP_PATH,
  //輸出的文件名 合并以后的js會(huì)命名為bundle.js
  output: {
    path: BUILD_PATH,
    filename: 'bundle.js'
  },
  //添加我們的插件 會(huì)自動(dòng)生成一個(gè)html文件
  plugins: [
    new HtmlwebpackPlugin({
      title: 'Hello World app'
    })
  ]
};

然后配置package.json

"scripts": {
    "build": "webpack"
  }

項(xiàng)目根目錄執(zhí)行

npm run build

終端顯示一堆信息,然后告訴你成功了溉躲。

你可以使用webpack --help看看一些運(yùn)行的時(shí)候可選的參數(shù)

你會(huì)發(fā)現(xiàn)多出來一個(gè)build文件夾榜田,直接點(diǎn)開里面的html文件,你會(huì)發(fā)現(xiàn)我們可愛的“hello world”已經(jīng)插入到頁面了锻梳。我們的任務(wù)完成了箭券,成功生成html,合并js疑枯,html引入了js辩块,js被執(zhí)行了。

配置webpack-dev-server

上面任務(wù)雖然完成了荆永,但是我們要不斷運(yùn)行程序然后查看頁面废亭,所以最好新建一個(gè)開發(fā)服務(wù)器,可以serve我們pack以后的代碼具钥,并且當(dāng)代碼更新的時(shí)候自動(dòng)刷新瀏覽器豆村。

安裝webpack-dev-server

npm install webpack-dev-server@2.7.1 --save-dev

安裝完畢后 在config中添加配置

module.exports = {
  ....
  devServer: {
    historyApiFallback: true,
    hot: true,
    inline: true,
    contentBase: "./app"
  },
  ...
}

然后再package.json里面配置一下運(yùn)行的命令,npm支持自定義一些命令

...
"scripts": {
  "start": "webpack-dev-server --hot --inline"
},
...

好了,萬事具備了骂删,在項(xiàng)目根目錄下輸入npm start,一堆花花綠綠的信息后server已經(jīng)起來了掌动,在瀏覽器里面輸入[http://localhost:8080 ] 發(fā)現(xiàn)偉大的hello world出現(xiàn)了,在js里面隨便修改一些輸出然后保存, boom!瀏覽器自動(dòng)刷新宁玫,新的結(jié)果出現(xiàn)了粗恢。

添加CSS樣式

現(xiàn)在來添加一些樣式,webpack使用loader的方式來處理各種各樣的資源欧瘪,比如說樣式文件适滓,我們需要兩種loader,css-loader 和 style-loader,css-loader會(huì)遍歷css文件凭迹,找到所有的url(...)并且處理。style-loader會(huì)把所有的樣式插入到你頁面的一個(gè)style tag中苦囱。

安裝我們的loader

npm install css-loader style-loader --save-dev

配置loader嗅绸,在webpack.config.js中


 devServer: {
    historyApiFallback: true,
    hot: true,
    inline: true,
    progress: true,
  },
  ...
  module: {
    loaders: [
      {
        test: /\.css$/,
        loaders: ['style-loader', 'css-loader']
      }
    ]
  },
  ...
  plugins: [
    new HtmlwebpackPlugin({
      title: 'Hello World app'
    })
  ]

看loaders的書寫方式,test里面包含一個(gè)正則撕彤,包含需要匹配的文件鱼鸠,loaders是一個(gè)數(shù)組,包含要處理這些程序的loaders羹铅,這里我們用了css和style蚀狰,注意loaders的處理順序是從右到左的,這里就是先運(yùn)行css-loader然后是style-loader.

新建一個(gè)樣式文件 main.css

h1 {
    color: red;
}

記得在入口文件index.js中引用

require('./main.css');

然后發(fā)現(xiàn)標(biāo)題變成紅色的了职员,webpack的理念是基于項(xiàng)目處理的麻蹋,把對(duì)應(yīng)的文件格式給對(duì)應(yīng)的loader處理,然后你就不用管了焊切,它會(huì)決定怎么壓縮扮授,編譯。

那現(xiàn)在想使用一些有愛的css預(yù)編譯程序专肪,來點(diǎn)sass吧刹勃。 你可能已經(jīng)想到了,再來個(gè)loader就行啦嚎尤,確實(shí)是這樣簡(jiǎn)單荔仁。

npm install sass-loader node-sass --save-dev

稍微修改一下config,刪掉我們先前添加的css規(guī)則芽死,加上下面的loader

  {
        test: /\.scss$/,
        loaders: ['style-loader', 'css-loader', 'sass-loader']
      },

添加兩個(gè)sass文件乏梁,variables.scss和main.scss

variables.scss

$red:red;

main.css

@import "./variables.scss";

h1 {
  color: $red;
}

在index.js中引用

require('./main.scss');

然后發(fā)現(xiàn)標(biāo)題如愿變紅

處理圖片和其他靜態(tài)文件

這個(gè)和其他一樣,也許你也已經(jīng)會(huì)玩了收奔。安裝loader掌呜,處理文件。諸如圖片坪哄,字體等等质蕉,不過有個(gè)神奇的地方它可以根據(jù)你的需求將一些圖片自動(dòng)轉(zhuǎn)成base64編碼的,為你減輕很多的網(wǎng)絡(luò)請(qǐng)求翩肌。

安裝url-loader

npm install url-loader --save-dev

配置config文件

  {
        test: /\.(png|jpg)$/,
        loader: 'url-loader?limit=40000'
     }

注意后面那個(gè)limit的參數(shù)模暗,當(dāng)你圖片大小小于這個(gè)限制的時(shí)候,會(huì)自動(dòng)啟用base64編碼圖片念祭。

添加第三方庫

有的時(shí)候還想來點(diǎn)jquery兑宇,moment,undersocre之類的庫粱坤,webpack可以非常容易的做到這一點(diǎn)隶糕,有謠言說Bower即將停止開發(fā)了, 作者推薦都使用npm來管理依賴瓷产。那么我們現(xiàn)在安裝在我們的app中添加jquery和moment的支持。

npm install jquery moment --save-dev

在js中引用

var sub = require('./sub');
var $ = require('jquery');
var moment = require('moment');
var app  = document.createElement('div');
app.innerHTML = '<h1>Hello World it</h1>';
document.body.appendChild(app);
app.appendChild(sub());
$('body').append('<p>look at me! now is ' + moment().format() + '</p>');

添加ES6的支持

首先 裝各種loader

npm install babel-loader babel-preset-env --save-dev

配置我們的config文件

...
      {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['env']
        }
      }
    }
...

為了配合開發(fā)環(huán)境需下載

npm install babel-plugin-transform-object-rest-spread --save-dev

最終如下

{
            test: /\.js$/,
            use:{
                loader:"babel-loader",
                options:{
                    presets:["env"],
                    plugins: [require('babel-plugin-transform-object-rest-spread')]
                }
            }
          }

現(xiàn)在我們可以改掉CommonJS風(fēng)格的文件了枚驻。

sub.js

export default function() {
  var element = document.createElement('h2');
  element.innerHTML = "Hello h2 world hahaha";
  return element;
}

index.js

import './main.scss';
import generateText from './sub';
import $ from 'jquery';
import moment from 'moment';

let app  = document.createElement('div');
const myPromise = Promise.resolve(42);
myPromise.then((number) => {
  $('body').append('<p>promise result is ' + number + ' now is ' + moment().format() + '</p>');
});
app.innerHTML = '<h1>Hello World it</h1>';
document.body.appendChild(app);
app.appendChild(generateText());

我們上面測(cè)試了import, export濒旦,const,let再登,promise等一系列es6的特性尔邓。

最后完美的輸出界面。歡迎光臨個(gè)人站清風(fēng)筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锉矢,一起剝皮案震驚了整個(gè)濱河市梯嗽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沽损,老刑警劉巖灯节,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缠俺,居然都是意外死亡显晶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門壹士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磷雇,“玉大人,你說我怎么就攤上這事躏救∥希” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盒使,是天一觀的道長(zhǎng)崩掘。 經(jīng)常有香客問我,道長(zhǎng)少办,這世上最難降的妖魔是什么苞慢? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮英妓,結(jié)果婚禮上挽放,老公的妹妹穿的比我還像新娘。我一直安慰自己蔓纠,他們只是感情好辑畦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腿倚,像睡著了一般纯出。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天暂筝,我揣著相機(jī)與錄音箩言,去河邊找鬼。 笑死焕襟,一個(gè)胖子當(dāng)著我的面吹牛分扎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胧洒,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼墨状!你這毒婦竟也來了卫漫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肾砂,失蹤者是張志新(化名)和其女友劉穎列赎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镐确,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包吝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了源葫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗越。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖息堂,靈堂內(nèi)的尸體忽然破棺而出嚷狞,到底是詐尸還是另有隱情,我是刑警寧澤荣堰,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布床未,位于F島的核電站,受9級(jí)特大地震影響振坚,放射性物質(zhì)發(fā)生泄漏薇搁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一渡八、第九天 我趴在偏房一處隱蔽的房頂上張望啃洋。 院中可真熱鬧,春花似錦呀狼、人聲如沸裂允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绝编。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間十饥,已是汗流浹背窟勃。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逗堵,地道東北人秉氧。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜒秤,于是被迫代替她去往敵國(guó)和親汁咏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺作媚,特此分享以備自己日后查看攘滩,也希望更多的人看到...
    小小字符閱讀 8,164評(píng)論 7 35
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,184評(píng)論 40 247
  • GitChat技術(shù)雜談 前言 本文較長(zhǎng),為了節(jié)省你的閱讀時(shí)間纸泡,在文前列寫作思路如下: 什么是 webpack漂问,它要...
    蕭玄辭閱讀 12,693評(píng)論 7 110
  • 今天頭很疼,什么時(shí)候開始落下這個(gè)毛病女揭,也許就是年紀(jì)大毛病多蚤假。陸陸續(xù)續(xù)還在看電視劇我的前半生,馬伊俐說的不念過...
    孤雁南游閱讀 256評(píng)論 0 1
  • 文/虢洛西 導(dǎo)語:如果你貪婪,那你失去的會(huì)多于你想要的掩驱;如果你狂妄芒划,那你失敗的會(huì)多于你炫耀的。大國(guó)博弈如此欧穴,人生民逼,...
    虢洛西閱讀 678評(píng)論 5 9