摘要:簡介是一款加載器兼容打包工具。所有的靜態(tài)資源都可以是模塊引用,而不僅僅是文件了。便捷開發(fā),能夠替代部分的的工作。擴(kuò)展性強(qiáng),插件機(jī)制完善。核心概念一個(gè)可執(zhí)行模塊或庫的入口文件。插件,用于擴(kuò)展的功能,在構(gòu)建生命周期的節(jié)點(diǎn)上加入擴(kuò)展為加入功能。
簡介
WebPack是一款加載器兼容打包工具。
可以處理各種資源:JS(JSX),coffee,less/sass,圖片等。
靜態(tài)資源打包工具
出色的前端自動化構(gòu)件化工具,模塊化工具,資源管理工具
兼容多種JavaScript書寫規(guī)范,具有更強(qiáng)大的JavaScript模塊化功能
特點(diǎn)
使用commonJs的形式書寫腳本。也對AMD,CMD的寫法支持。
所有的靜態(tài)資源都可以是模塊引用,而不僅僅是JavaScript文件了。
便捷開發(fā),能夠替代部分的grunt/gulp的工作。
擴(kuò)展性強(qiáng),插件機(jī)制完善。
僅需要對應(yīng)的加載器即可支持,配置簡單,關(guān)注文件依賴關(guān)系
工作原理:
把項(xiàng)目當(dāng)作一個(gè)整體,通過一個(gè)給定的主文件(如:app.js),webpack將從這個(gè)文件開始找到項(xiàng)目中的所有依賴文件,通過loaders處理它們,打包為一個(gè)瀏覽器可以識別的JavaScript文件。
entry:一個(gè)可執(zhí)行模塊或庫的入口文件。
chunk:多個(gè)文件組成的一個(gè)代碼開,例如把一個(gè)可執(zhí)行模塊和它所有依賴的模塊組合和一個(gè)chunk。
loader:文件轉(zhuǎn)換器。
plugin:插件,用于擴(kuò)展webpack的功能,在webpack構(gòu)建生命周期的節(jié)點(diǎn)上加入擴(kuò)展hook為webpack加入功能。
從啟動webpack構(gòu)建到輸入結(jié)果經(jīng)歷了一系列過程:
解析webpack配置參數(shù),合并從shell傳入webpack.config.js文件里配置的參數(shù),生產(chǎn)最后的配置結(jié)果
注冊所有配置的插件,好讓插件監(jiān)聽webpack構(gòu)建生命周期的事件節(jié)點(diǎn),以做出對應(yīng)的反應(yīng)
從配置的entry文件入口開始解析文件構(gòu)建AST語法樹,找出每個(gè)文件所依賴的文件,遞歸下去。
在解析文件遞歸的過程中根據(jù)文件類型和loader配置找出合適的loader用來對文件進(jìn)行轉(zhuǎn)換
遞歸完后得到每個(gè)文件的最后總結(jié)果,根據(jù)entry配置生成代碼塊chunk
輸出所有chunk到文件系統(tǒng)
注意,在構(gòu)建生命周期中有一系列插件在合適的時(shí)機(jī)做了合適的事情,比如UglifyJsPlugin會在loader轉(zhuǎn)換遞歸完后對結(jié)果再使用UglifyJs壓縮覆蓋之前的結(jié)果。
webpack配置文件webpack.config.js
配置說明:
plugins 插件項(xiàng)
entry 頁面入口文件
output 對應(yīng)輸出項(xiàng)(即入口文件最終生成位置,名字)
modules.loaders 配置每一個(gè)種資源文件需要使用什么加載器來處理(多個(gè)loader之間使用"!" 連接)
基本命令webpack 啟動webpack的方法
webpack -p 發(fā)布環(huán)境編譯(壓縮代碼),對打包后的文件進(jìn)行壓縮
webpack -w 提供watch方法,實(shí)時(shí)進(jìn)行進(jìn)行打包更新
webpack -d 提供source map,方便調(diào)試
webpack --config xx.js 以某個(gè)config作為打包,使用另外一份配置文件來打包(例如:webpack.config2.js)
webpack --help 更多的命令
Node API 使用:
var webpack = require("webpack");
默認(rèn)使用當(dāng)前目錄的webpack.config.js 作為配置文件。可以根據(jù)不同的需求配置不同的config
極簡webpack配置文件moudle.exports = { entry: [ "./app/main.js" ], output: { path: __dirname + "/dist/", publicPath: "/dist/", filename: "bundle.js" } }
其中entry參數(shù)定義了打包后的入口文件,數(shù)組中的所有文件會打包生成一個(gè)filename文件
output參數(shù)定義了輸出文件的位置
在 package.json 文件中配置
"scripts": { "dev": "webpack", "deploy": "webpack --config webpack.deploy.config.js", "test": "echo "Error: no test specified" && exit 1" }
可以使用 npm run dev 和 npm run deploy 指令.
需要在package.json 文件所在目錄指令有效
公共文件提取
使用了一個(gè) CommonsChunkPlugin 的插件,它用于提取多個(gè)入口文件的公共腳本部分,然后生成一個(gè)common.js 來方便多頁面之間進(jìn)行復(fù)用
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin"); module.exports = { entry: {a: "./a", b: "./b"}, output: { filename: "[name].js" }, plugins: [ new CommonsChunkPlugin("common.js") ] }
有用的配置項(xiàng)
module.noParse 如果確定一個(gè)模塊中沒有其它依賴的,就可以配置這項(xiàng),webpack將不再掃描這個(gè)文件中的依賴
module: { loaders: [{ test: /.css$/, loader: "style-loader"}], noParse: [/moment-with-locales/] }
resolve.alias 別名.是Webpack 的一個(gè)配置項(xiàng),它的作用是把用戶的一個(gè)請求重定向到另一個(gè)路徑 (理解成 302)
resolve: { extensions: [".js", ".less", ".css"], alias: { moment: "moment/min/moment-with-locales.min.js" } }加載器
對應(yīng)各種不同的資源,需要有各自的loader
模塊: 靜態(tài)的文件, 比如: JavaScript,CSS, LESS, TypeScript
JSX,CoffeeScript,圖片等等
文件配置: 通過正則表達(dá)式對文件名進(jìn)行匹配.
對于不同的模塊有其對應(yīng)的模塊加載器,它們可以進(jìn)行串聯(lián)
module: { loaders: [{ test: /.less$/, loader: "style=loader!css-loader!less-loader" }, { test: /.(png!jpe?g)$/, loader: "url-loader?limit=10000&name=build/[name].[ext]" }] }
require() 還支持在資源path前面指定loader,即 require(![loaderslist]![source path]) 形式
require("style!css!less!./mystyles.less");
不同規(guī)范的模塊加載實(shí)現(xiàn) ( AMD、CommonJS、ES6 )
CommonJS 的rqeuire函數(shù)則是同步加載 -- 使用require.ensure實(shí)現(xiàn)兼容
AMD是模塊異步加載并保證執(zhí)行順序 -- 使用require實(shí)現(xiàn)兼容
ES6中使用import實(shí)現(xiàn)模塊的引入 -- 使用Babel實(shí)現(xiàn)兼容
在Webpack中推薦CommonJS方法去加載模塊,這種方式語法更加簡潔直觀.
webpack 內(nèi)部實(shí)現(xiàn)命令不同
require.ensure(CommonJs); // 保證CommonJs順序
require.ensure(["module-a", "module-b"], function ( require ) { var a = require("module-a"); var b = require("module-b"); // ... });
require(AMD);
require(["module-a", "module-b"], function ( a, b ) { // ... });
require.include(request);
require.ensure([], function( require ) { require.include("./file"); require("./file2"); });
sourcemap
可以把開發(fā)文件在瀏覽器中顯示,便于調(diào)試
module.exports = { entry: "./entry.js", output: { path: __dirname, filename: "bundle.js" }, devtool: "source-map" }
webpack-dev-server
生成一個(gè)開發(fā)使用的服務(wù)器,在文件有變化的時(shí)候,自動打包。有文件的熱替換的功能
webpack-dev-server --inline --hot // 文件自動打包, 模塊熱替換
react 項(xiàng)目基礎(chǔ)搭建
需要的工具
npm install babel-core babel-preset-es2015 babel-parset-react webpack webpack-dev-server babel-loader react-hot-loader --save-dev npm install react react-dom --save-dev
多帶帶使用babel,需要安裝的工具
npm install babel-loader babel-core babel-preset-es2015 --save-dev模塊的引用
使用 require 方式直接引用靜態(tài)文件
CSS 被轉(zhuǎn)化為style標(biāo)簽
require("./myapp.less"); var myapp = require("./myapp.js"); console.log(myapp);圖片打包
使用rquire方式直接引用靜態(tài)文件
url-loader可以幫助實(shí)現(xiàn)圖片的封裝打包,也可以通過require實(shí)現(xiàn)
圖片可能被轉(zhuǎn)化成 base64格式的dataUrl
div.img { background: url("../img/xxx.jpg"); } // 或者 var img = document.createElement("img"); img.src = require("../image/xxx.jpg"); document.body.appendChild(img);CSS文件獨(dú)立打包
通常并不想把樣式打在腳本中,最好獨(dú)立生成CSS文件,在頁面中外鏈才好,這時(shí)可以使用插件extract-text-webpack-plugin --save-dev
npm install extract-text-webpack-plugin --save-dev
plugins: [ new ExtractTextPlugin("styles.css") ]webapck-dev-server
webpack-dev-server 開發(fā)服務(wù)器
利用Express開發(fā)靜態(tài),時(shí)時(shí)刷新.
基于Node Express框架的輕量級開發(fā)服務(wù)器
靜態(tài)資源Web服務(wù)器
開發(fā)中會監(jiān)聽文件的變化實(shí)時(shí)打包對于簡單靜態(tài)頁面或者僅僅依賴于獨(dú)立服務(wù)的前端頁面,都可以直接使用這個(gè)開發(fā)服務(wù)器進(jìn)行開發(fā)
Webpack開發(fā)服務(wù)器需要多帶帶安裝
npm install -g webpack-dev-server
啟動命令
webpack-dev-server --content-base build/ --hot插件
npm install html-webpack-plugin --save-dev
new HtmlWebpackPlugin(), new HtmlWebpackPlugin({ template: "app/custom.html", filename: "custom.html", chunks: ["mobile"], inject: "body" })config
module.exports = { devtool: "source-map", entry: getEntry(), //獲取項(xiàng)目入口js文件 output: { path: path.join(__dirname, "dist/js/"), //文件輸出目錄 publicPath: "dist/js/", //用于配置文件發(fā)布路徑,如CDN或本地服務(wù)器 filename: "[name].js", //根據(jù)入口文件輸出的對應(yīng)多個(gè)文件名 }, module: { //各種加載器 loaders: [{ test: /.css/, loader: "style!css" }, { test: /.(png!jpe?g)$/, loader: "url-loader?limit=10240&name=build/[name].[ext]" }, { test: /.jsx?$/, loader: "babel-loader" }] }, resolve: { //配置別名,在項(xiàng)目中可縮減引用路徑 alias: { jquery: srcDir + "/js/lib/jquery.min.js", core: srcDir + "/js/core", ui: srcDir + "/js/ui" } }, plugins: [ //提供全局的變量,在模塊中使用無需用require引入 new webpack.ProvidePlugin({ jQuery: "jquery", $: "jquery", // nie: "nie" }), //將公共代碼抽離出來合并為一個(gè)文件 new CommonsChunkPlugin("common.js"), //js文件的壓縮 new uglifyJsPlugin({ compress: { warnings: false } }) ] };
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80097.html
摘要:安裝插件能幫忙每次打包之前先刪除文件夾。安裝插件提供了一種自定義編譯期間如何報(bào)告進(jìn)度的方法。插件能創(chuàng)建環(huán)境變量開發(fā)與生產(chǎn)時(shí)的不同配置時(shí)使用選項(xiàng)設(shè)置不同的配置文件開發(fā)生產(chǎn)能夠?yàn)槲覀兲峁┮粋€(gè)簡單的并且具有實(shí)時(shí)重新加載功能。 寫在前面,近期有想法整理一下前端工程化相關(guān)的知識,就先從打包工具開始吧;今天帶來的是webpack相關(guān)的一些常用插件配置,后期有時(shí)間話,也會出一些比較輕量級的打包工具的...
學(xué)習(xí)的過程中收藏了這些優(yōu)秀教程和的項(xiàng)目,希望對你有幫助。 github地址, 有不錯的就更新 官方文檔 中文指南 初級教程 webpack-howto 作者:Pete Hunt Webpack 入門指迷 作者:題葉 webpack-demos 作者:ruanyf 一小時(shí)包教會 —— webpack 入門指南 作者:VaJoy Larn webpack 入門及實(shí)踐 作者:...
摘要:上一章我們了解了的編譯環(huán)境搭建項(xiàng)目構(gòu)建二編譯環(huán)境搭建這一章我們會結(jié)合的,介紹本地測試服務(wù)器的搭建過程。三開發(fā)環(huán)境有一些特性是專門用于開發(fā)環(huán)境的,可以幫助我們搭建一個(gè)更好的開發(fā)環(huán)境。我們可以通過配合使用來搭建本地服務(wù)。 注:以下教程均在 windows 環(huán)境實(shí)現(xiàn),使用其他操作系統(tǒng)的同學(xué)實(shí)踐過程可能會有些出入。 ??上一章我們了解了 webpack 的 ES6 編譯環(huán)境搭建:webpack...
摘要:資源哈希編碼使用可以為每個(gè)包的名稱注入一個(gè)哈希值例如,,以便在版本更新后使客戶端上舊版本的包無效重新下載。如此受人喜愛的原因之一是熱模塊更換。可以為文件名生成哈希值,在內(nèi)容更改時(shí),可以作廢瀏覽器緩存中上個(gè)版本的包。 原文鏈接:https://survivejs.com/webpack...翻譯計(jì)劃:https://segmentfault.com/a/11... 涉及到的未翻譯單詞 ...
摘要:同時(shí)不能直接單純的指定輸出的文件名稱,比如,將會報(bào)錯,可以換成以下方式指定,或者其他類似方式。如果打包過程出現(xiàn)錯誤,比如語法錯誤,將會在控制臺以紅色文字顯示,并且在你修復(fù)之后會再次打包。 0x001 概述 其實(shí)我不知道怎么寫,所以決定就一塊一塊的寫點(diǎn)平常配置的過程,根據(jù)不同東西稍微分區(qū)一下就好了 0x002 初始化項(xiàng)目結(jié)構(gòu) $ mkdir webpack_study $ cd webp...
摘要:入門什么是官網(wǎng)介紹是一個(gè)模塊打包器。處理帶有依賴關(guān)系的模塊,生成一系列表示這些模塊的靜態(tài)資源。。我們在當(dāng)前項(xiàng)目根目錄下新建一個(gè)文件,為命令配置選項(xiàng)。引入生成的在瀏覽器中打開。我們刷新頁面,可以發(fā)現(xiàn)頁面發(fā)生了變化。 webpack 入門 1. 什么是webpack 官網(wǎng)介紹:webpack是一個(gè)模塊打包器。webpack 處理帶有依賴關(guān)系的模塊,生成一系列表示這些模塊的靜態(tài)資源。(web...
閱讀 2007·2021-11-15 18:09
閱讀 899·2021-09-06 15:13
閱讀 2643·2021-08-23 09:43
閱讀 2024·2019-08-30 15:54
閱讀 2218·2019-08-30 13:56
閱讀 2484·2019-08-26 11:31
閱讀 3077·2019-08-26 10:56
閱讀 700·2019-08-26 10:28