webpack2快速入門的幾個(gè)實(shí)例

本文是在請(qǐng)練完這16個(gè)webpack小例子基礎(chǔ)上補(bǔ)充的webpack2的版本

安裝

$ npm i -g webpack webpack-dev-server

配置

配置文件為 webpack.config.js

module.exports = {
  entry: './main.js', // 入口文件
  output: {
    filename: 'bundle.js' //打包后的文件名
  }
};

命令行

  1. webpack 構(gòu)建文件
  2. webpack -p 發(fā)布
  3. webpack --watch 監(jiān)聽項(xiàng)目
  4. webpack -d 包含source map方便調(diào)試
  5. webpack --colors讓打包界面更好看

在package.json中配置命令

{
  // ...
  "scripts": {
    "dev": "webpack-dev-server --devtool eval --progress --colors",
    "deploy": "NODE_ENV=production webpack -p"
  },
  // ...
}

使用

單文件入口

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  }
};

多文件入口

module.exports = {
  entry: {
    bundle1: './main1.js',
    bundle2: './main2.js'
  },
  output: {
    filename: '[name].js'
  }
};

引用

<html>
  <body>
    <script src="bundle1.js"></script>
    <script src="bundle2.js"></script>
  </body>
</html>

loaders

某些規(guī)律

在loaders的每個(gè)對(duì)象中,

  1. 使用多個(gè)loader,用!連接
  2. 傳遞參數(shù)是在loader名字后面加?驳癌,多個(gè)參數(shù)用&連接

babel-loader

module.exports = {
  entry: './main.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      {
        test: /\.js[x]?$/,
        exclude: /node_modules/,
        loader: 'babel-loader?presets[]=es2015&presets[]=react'
      },
    ]
  }
};

module.loaders 區(qū)域是用來分配loader的. 像上面的代碼片段使用了 babel-loader 需要安裝插件 babel-preset-es2015 和 babel-preset-react to 編譯成 ES6 and React. 可以用query配置參數(shù)

module: {
  loaders: [
    {
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'react']
      }
    }
  ]
}

css-loader style-loader

先在css-loader中讀取css文件,這里為main.js
注意移動(dòng)在某個(gè)js文件中引入css文件

// main.js
require ('./xxx.css')

之后再style-loader中將樣式插入到html中

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      { test: /\.css$/, loader: 'style-loader!css-loader' },
    ]
  }
};

image-loader

參數(shù)前是用次乓?連接的

依然和處理css格式的文件一樣,需要在main.js中require孽水,然后用fileloader

var img1 = document.createElement("img");
img1.src = require("./small.png");
document.body.appendChild(img1);

轉(zhuǎn)換為圖片文件

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' }
    ]//url-loader 轉(zhuǎn)換圖片文件. 如果圖片的大小小于 8192 bytes,它將會(huì)轉(zhuǎn)成base64位的地址; 相反, 它就是普通地址. 
  }
};

Module

css module

CSS Module可以開啟全局變量和局部變量票腰,:global(...)表示全局變量,可以在全局中使用樣式
更多配置

:global(.h2) {
  color: blue;
}

main.jsx

var React = require('react');
var ReactDOM = require('react-dom');
var style = require('./app.css');

ReactDOM.render(
  <div>
    <h1 className={style.h1}>Hello World</h1>
    <h2 className="h2">Hello Webpack</h2>
  </div>,
  document.getElementById('example')
);
module.exports = {
  entry: './main.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      {
        test: /\.js[x]?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        query: {
          presets: ['es2015', 'react']
        }
      },
      {
        test: /\.css$/,
        loader: 'style-loader!css-loader?modules'
      }
    ]
  }
};

使用composes

如需要引用以下兩個(gè)css文件:

style1.css

.text1{
    ......
    color:yellow;
}

style2.css

.text2{...}

定義一個(gè)main.css供于繼承并引用

.context1{
    composes:text1 from "path/style1.css";
    color:red; // 這里會(huì)覆蓋原有樣式
}
.context2{
    composes:text2 from "path/style2.css";
    color:blue;
}

在main.js中

import styles from './main.css';
import React, { Component } from 'react';
export default class varA extends Component {
  render() {
    return (
      <div className={styles.context1}>
        <p className={styles.context2}>Style Variant A</p>
      </div>
    );
  }

};

css動(dòng)畫的處理

anime.css

@keyframes bounce {
  33% { transform: translateY(-20px); }
  66% { transform: translateY(0px); }
}
.bounce {
  animation: bounce 1s infinite ease-in-out;
}

main.css

.bounce{
    composes: bounce from 'path/anime.css'
    background-color:red;
}

main.js

import styles from './main.css';
import React, { Component } from 'react';
export default class  varB extends Component {
  render() {
    return (
      <div className={styles.bounce}>
      </div>
    );
  }
}

Plugins

UglifyJs Plugin

可以優(yōu)化代碼女气,去掉本身附加的東西杏慰,減小js代碼量

var webpack = require('webpack');
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  plugins: [
    new uglifyJsPlugin({
      compress: {
        warnings: false
      }
    })
  ]
};

經(jīng)過打包后,main.js將會(huì)壓縮為

var o="Hello";o+=" World",document.write("<h1>"+o+"</h1>")

相關(guān)配置

鏈接

html webpack plugin & open browser webpack plugin

html-webpack-plugin 創(chuàng)建 index.html,open-browser-webpack-plugin 打開瀏覽器
HtmlwebpackPlugin只支持node7

var HtmlwebpackPlugin = require('html-webpack-plugin');
var OpenBrowserPlugin = require('open-browser-webpack-plugin');

module.exports = {
  entry: './main.js',
  output: {
    filename: 'bundle.js'
  },
  plugins: [
    new HtmlwebpackPlugin({
      title: 'Webpack-demos',
      filename: 'index.html'
    }),
    new OpenBrowserPlugin({
      url: 'http://localhost:8080'
    })
  ]
};

環(huán)境變量

設(shè)置環(huán)境變量控制特定的代碼輸出路徑

var webpack = require('webpack');
module.exports = function() {
      return {
          entry: './main.js',
          output: {
              filename: 'bundle.js'
          },
        plugins: [
            new webpack.EnvironmentPlugin(['NODE_ENV', 'DEBUG'])
    ]
      };
};
// main.js
document.write('<h1>Hello World</h1>');
if (process.env.NODE_ENV === 'production') {
    console.log('Welcome to production');
}
if (process.env.NODE_ENV === 'development') {
    console.log('Welcome to development'); // show
}
if (process.env.DEBUG) {
    console.log('Debugging output'); // show
}

注意:先命令行執(zhí)行 set NODE_ENV=development主卫,之后再wds

code splitting

a.js

module.export="i will be compiled to 0.bundle.js"

main.js

function determinated(){
  // import()中不能寫入變量!!
  import('./a').then((a)=>{
      document.open()
        document.write(`<h1>${a}</h1>`)
        document.close()
    }).catch((err)=>{
    console.log(err)
    })
}
determinated()

webpack.config.js不變逃默,但最后編譯出來的代碼被分成了兩個(gè)部分。

CommonsChunkPlugin

CommonsChunkPlugin是一個(gè)選擇性功能簇搅,可以創(chuàng)建一個(gè)單獨(dú)的文件(稱為一個(gè)塊)完域,由多個(gè)入口點(diǎn)之間共享的通用模塊組成。通過將公共模塊與捆綁分開瘩将,生成的分塊文件最初可以加載一次吟税,并存儲(chǔ)在高速緩存中供以后使用凹耙。這會(huì)使頁面優(yōu)化,因?yàn)闉g覽器可以快速提供來自緩存的共享代碼肠仪,而不是每當(dāng)訪問新頁面時(shí)被強(qiáng)制加載更大的包

// webpack.config.js
//CommonsChunkPlugins是webpack自身的方法肖抱,功能是提取兩個(gè)方法共有的代碼模塊
var webpack = require('webpack');
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");

module.exports = {
    entry: {
        bundle1: './main1.jsx',
        bundle2: './main2.jsx'
    },
    output: {
        filename: '[name].js'
    },
    module: {
        loaders: [
            {test: /\.js[x]?$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react'},
        ]
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: "init'",
            filename: "init.js",
        }),
        new uglifyJsPlugin({
            compress: {
                warnings: false
            }
        })
    ]
}

注意加載順序,要把通用模塊放在前面

<html>
  <body>
    <div id="a"></div>
    <div id="b"></div>
    <script src="init.js"></script>
    <script src="bundle1.js"></script>
    <script src="bundle2.js"></script>
  </body>
</html>

兩個(gè)bundle文件中都包含init

Vendor chunk

抽第三方庫异旧,并設(shè)置為變量意述,拿jquery舉例。比如:

// main.js
$('h1').text('Hello World');
$('h1').css('color','red');
// webpack.config.js
var webpack = require('webpack');
module.exports = {
  entry: {
    app: './main.js',
    vendor: ['jquery'],
  },
  output: {
    filename: 'bundle.js'
  },
  plugins: [
      new webpack.optimize.CommonsChunkPlugin({
          name:'vendor',
          filename:'vendor.js'
      }),
      new webpack.ProvidePlugin({ 
          $: 'jquery',//在這里設(shè)置一個(gè)變量
          jQuery: 'jquery'
      })
  ]
};

// 省略部分代碼
// 要先引入vendor.js
<script src="vendor.js"></script>
<script src="bundle.js"></script>

Exposing global variables

如果想引入某些模塊吮蛹,但不想被webpack預(yù)加載且依然可以通過CMD荤崇、AMD或者window/global全局的方式訪問。

比如潮针,想要全局引入data.js术荤,但不想被編譯到bundle中

// data.js
var data = 'Hello World';
// webpack.config.js
module.exports = {
  entry: './main.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders:[
      { test: /\.js[x]?$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' },
    ]
  },
  externals: {
    'data2': 'data' //data2為注冊(cè)的全局變量
  }
};
// main.js
var data2 = require('data2'); //直接require就可以了
var React = require('react');
var ReactDOM = require('react-dom');
var $ = require("jquery");

ReactDOM.render(
  <h1>{data2}</h1>,
  document.body
);

Hot Module Replacement

熱更新是在應(yīng)用程序運(yùn)行時(shí)不進(jìn)行頁面重新加載的情況下交換,添加或刪除模塊每篷。
親測(cè)webpack2只要wds就可以實(shí)現(xiàn)熱更新了瓣戚,以下配置適用于wepack1
兩種方法

  1. 命令行
$ webpack-dev-server --hot --inline

2.修改webpack.config.js

var webpack = require('webpack');
var path = require('path');

module.exports = {
  entry: [
    'webpack/hot/dev-server',
    'webpack-dev-server/client?http://localhost:8080',
    './index.js'
  ],
  output: {
    filename: 'bundle.js',
    publicPath: '/static/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ],
  module: {
    loaders: [{
      test: /\.jsx?$/,
      loaders: ['babel-loader?presets[]=es2015&presets[]=react'],
      include: path.join(__dirname, '.')
    }]
  }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焦读,隨后出現(xiàn)的幾起案子子库,更是在濱河造成了極大的恐慌,老刑警劉巖吨灭,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刚照,死亡現(xiàn)場(chǎng)離奇詭異刑巧,居然都是意外死亡喧兄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門啊楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吠冤,“玉大人,你說我怎么就攤上這事恭理≌蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵颜价,是天一觀的道長涯保。 經(jīng)常有香客問我,道長周伦,這世上最難降的妖魔是什么夕春? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮专挪,結(jié)果婚禮上及志,老公的妹妹穿的比我還像新娘片排。我一直安慰自己,他們只是感情好速侈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布率寡。 她就那樣靜靜地躺著,像睡著了一般倚搬。 火紅的嫁衣襯著肌膚如雪冶共。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天每界,我揣著相機(jī)與錄音比默,去河邊找鬼。 笑死盆犁,一個(gè)胖子當(dāng)著我的面吹牛命咐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谐岁,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼醋奠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了伊佃?” 一聲冷哼從身側(cè)響起窜司,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎航揉,沒想到半個(gè)月后塞祈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帅涂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年议薪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳友。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斯议,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醇锚,到底是詐尸還是另有隱情哼御,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布焊唬,位于F島的核電站恋昼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赶促。R本人自食惡果不足惜液肌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芳杏。 院中可真熱鬧矩屁,春花似錦辟宗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烁峭,卻和暖如春容客,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背约郁。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工缩挑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鬓梅。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓供置,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绽快。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芥丧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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