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