⑴ webpack怎麼處理大於100k的庫
你好,每次打包從入口開始,會parse所有的依賴,多的時候竟然打包一次要2秒多,簡直不能忍。然而,有幾個解決方案,最有效的,是使用weboack的watch,只有文件md5變化時,才會重新打包,並且只parse有變化的文件,其他沒變化的文件是使用緩存的。
打包在一起是為了減少 request 數量從而能並發更多請求,提升總體載入速度,所以臃腫的一個文件本來就是目的而非副作用。如果要解決調試問題可以使用 Source Map。
所謂的代碼分割,說白了就是模塊劃分,把大文件 breakdown 的同時還能進行依賴管理,降低開發和維護的成本,而這個的好處是體現在開發時而非上線後的,如果上線後還是一堆零散的文件,這個依賴管理工具還是趁早別做了.
⑵ 如何解決webpack打包的文件體積過大的問題
解決webpack打包的文件體積過大的問題:
確實,每次打包從入口開始,會parse所有的依賴,多的時候竟然打包一次要2秒多,簡直不能忍。然而,有幾個解決方案,最有效的,是使用weboack的watch,只有文件md5變化時,才會重新打包,並且只parse有變化的文件,其他沒變化的文件是使用緩存的。這樣子,打包時間迅速降到200ms以內。 再優化下去的話,我們要知道webpack打包的過程中做了啥,首先是解析依賴啦,然後就是各種各樣的loader。從解析依賴的角度入手,我們可以bower install一些打包好的文件,然後通過設置別名讓依賴指向這個文件,這樣就減去了第三方庫的依賴解析時間。 然後各種各樣的loader也是很耗時的,一種辦法是在loader裡面配include,讓loader只針對特殊資源。
⑶ webpack中是什麼意思有什麼用如何用
1. 為什麼用 webpack?
他像 Browserify, 但是將你的應用打包為多個文件. 如果你的單頁面應用有多個頁面, 那麼用戶只從下載對應頁面的代碼. 當他么訪問到另一個頁面, 他們不需要重新下載通用的代碼.
他在很多地方能替代 Grunt 跟 Gulp 因為他能夠編譯打包 CSS, 做 CSS 預處理, 編譯 JS 方言, 打包圖片, 還有其他一些.
它支持 AMD 跟 CommonJS, 以及其他一些模塊系統, (Angular, ES6). 如果你不知道用什麼, 就用 CommonJS.
2. Webpack 給 Browserify 的同學用
對應地:
browserify main.js > bundle.js
webpack main.js bundle.js
Webpack 比 Browserify 更強大, 你一般會用 webpack.config.js 來組織各個過程:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
}
};
這僅僅是 JavaScript, 可以隨意添加要運行的代碼.
3. 怎樣啟動 webpack
切換到有 webpack.config.js 的目錄然後運行:
webpack 來執行一次開發的編譯
webpack -p for building once for proction (minification)
webpack -p 來針對發布環境編譯(壓縮代碼)
webpack --watch 來進行開發過程持續的增量編譯(飛快地!)
webpack -d 來生成 SourceMaps
4. JavaScript 方言
Webpack 對應 Browsserify transform 和 RequireJS 插件的工具稱為 loader. 下邊是 Webpack 載入 CoffeeScript 和 Facebook JSX-ES6 的配置(你需要 npm install jsx-loader coffee-loader):
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' } // loaders 可以接受 querystring 格式的參數
]
}
};
要開啟後綴名的自動補全, 你需要設置 resolve.extensions 參數指明那些文件 Webpack 是要搜索的:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' }
]
},
resolve: {
// 現在可以寫 require('file') 代替 require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
}
};
5. 樣式表和圖片
首先更新你的代碼用 require() 載入靜態資源(就像在 Node 里使用 require()):
require('./bootstrap.css');
require('./myapp.less');
var img = document.createElement('img');
img.src = require('./glyph.png');
當你引用 CSS(或者 LESS 吧), Webpack 會將 CSS 內聯到 JavaScript 包當中, require() 會在頁面當中插入一個 `<style>標簽. 當你引入圖片, Webpack 在包當中插入對應圖片的 URL, 這個 URL 是由require()` 返回的.
你需要配置 Webpack(添加 loader):
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
path: './build', // 圖片和 JS 會到這里來
publicPath: 'http://mycdn.com/', // 這個用來成成比如圖片的 URL
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, // 用 ! 來連接多個人 loader
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} // 內聯 base64 URLs, 限定 <=8k 的圖片, 其他的用 URL
]
}
};
6. 功能開關
有些代碼我們只想在開發環境使用(比如 log), 或者 dogfooging 的伺服器里邊(比如內部員工正在測試的功能). 在你的代碼中, 引用全局變數吧:
if (__DEV__) {
console.warn('Extra logging');
}
// ...
if (__PRERELEASE__) {
showSecretFeature();
}
然後配置 Webpack 當中的對應全局變數:
// webpack.config.js
// definePlugin 接收字元串插入到代碼當中, 所以你需要的話可以寫上 JS 的字元串
var definePlugin = new webpack.DefinePlugin({
__DEV__: JSON.stringify(JSON.parse(process.env.BUILD_DEV || 'true')),
__PRERELEASE__: JSON.stringify(JSON.parse(process.env.BUILD_PRERELEASE || 'false'))
});
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
plugins: [definePlugin]
};
然後你在控制台里用 BUILD_DEV=1 BUILD_PRERELEASE=1 webpack 編譯. 注意一下因為 webpack -p 會執行 uglify dead-code elimination, 任何這種代碼都會被剔除, 所以你不用擔心秘密功能泄漏.
7. 多個進入點(entrypoints)
比如你用 profile 頁面跟 feed 頁面. 當用戶訪問 profile, 你不想讓他們下載 feed 頁面的代碼. 因此你創建多個包: 每個頁面一個 "main mole":
// webpack.config.js
mole.exports = {
entry: {
Profile: './profile.js',
Feed: './feed.js'
},
output: {
path: 'build',
filename: '[name].js' // 模版基於上邊 entry 的 key
}
};
針對 profile, 在頁面當中插入 <script src="build/Profile.js"></script>. feed 頁面也是一樣.
8. 優化共用代碼
feed 頁面跟 profile 頁面共用不要代碼(比如 React 還有通用的樣式和 component). Webpack 可以分析出來他們有多少共用模塊, 然後生成一個共享的包用於代碼的緩存.
// webpack.config.js
var webpack = require('webpack');
var commonsPlugin =
new webpack.optimize.CommonsChunkPlugin('common.js');
mole.exports = {
entry: {
Profile: './profile.js',
Feed: './feed.js'
},
output: {
path: 'build',
filename: '[name].js'
},
plugins: [commonsPlugin]
};
在上一個步驟的 script 標簽前面加上 <script src="build/common.js"></script> 你就能得到廉價的緩存了.
9. 非同步載入
CommonJS 是同步的, 但是 Webpack 提供了非同步指定依賴的方案. 這對於客戶端的路由很有用, 你想要在每個頁面都有路由, 但你又不像在真的用到功能之前就下載某個功能的代碼.
聲明你想要非同步載入的那個"分界點". 比如:
if (window.location.pathname === '/feed') {
showLoadingState();
require.ensure([], function() { // 語法奇葩, 但是有用
hideLoadingState();
require('./feed').show(); // 函數調用後, 模塊保證在同步請求下可用
});
} else if (window.location.pathname === '/profile') {
showLoadingState();
require.ensure([], function() {
hideLoadingState();
require('./profile').show();
});
}
Webpack 會完成其餘的工作, 生成額外的 chunk 文件幫你載入好.
Webpack 在 HTML script 標簽中載入他們時會假設這些文件是怎你的根路徑下. 你可以用 output.publicPath 來配置.
// webpack.config.js
output: {
path: "/home/proj/public/assets", // path 指向 Webpack 編譯能的資源位置
publicPath: "/assets/" // 引用你的文件時考慮使用的地址
⑷ webpack生成bundle.js文件為什麼那麼大,會影響載入速度嗎
當然會比較大,因為不光打包了自己開發的JavaScript文件,還把依賴(就是那些第三方的庫文件)也都打包進去了,確實會比較大。
webpack的好處有幾項
解決依賴關系
多模塊化標准支持
多功能插件支持
相比這些在軟體工程中急需解決的問題,「大」這個小事兒可以通過其他方式解決。
譬如,
uglify,可以很大程度上壓縮源代碼,使之體積減小。
或者通過nginx的gzip_comp_level選項可以設置1 ~ 9不同的壓縮級別,以降低網路傳輸壓力。
兩者混用效果奇佳,而且也是最常見最有效的方式
例如React.js的源文件有610k左右,uglify之後已經不到200k了,再通過nginx壓縮一把,用戶在瀏覽器下載時,只有40k左右了。
以當今的網路環境,除非自己有精確測試結果,否則真心沒必要一開始就考慮什麼文件大小的問題,咱們已經不是那個時代了
⑸ 【Web前端基礎】webpack打包原理是什麼
【Web前端基礎】webpack打包原理是什麼?1、概念
本質上,webpack 基於node平台,利用 node 的各種api來實現 javascript 應用程序的一個靜態模塊的打包工具。
在打包過程中,構建依賴關系,並且實現模塊引用預處理,以及緩存等。
2、分析
1、人口文件
// mian.js
const a = require('./m1')
const b= require('./m2')
import { test } from './m1'
console.log(test)
//m2.js
export default {
b:2
}
//m1.js
export const test = {test:1}
export default {
a:1
}
2、生產的文件
(function (moles) {
var installedMoles = {}; //緩存
/*
* 載入模塊函數
* 傳入模塊id
* */
function __webpack_require__(moleId) {
// 檢查緩存中是否有模塊
if (installedMoles[moleId]) {
return installedMoles[moleId].exports;
}
// 創建一個新模塊,並緩存起來
var mole = installedMoles[moleId] = {
i: moleId,
l: false,
exports: {}
};
// 調模塊的函數,moles
moles[moleId].call(mole.exports, mole, mole.exports, __webpack_require__);
mole.l = true;
// 返回對應模塊
return mole.exports;
}
__webpack_require__.m = moles;
__webpack_require__.c = installedMoles;
__webpack_require__.d = function (exports, name, getter) {
if (!__webpack_require__.o(exports, name)) {
Object.defineProperty(exports, name, {
configurable: false,
enumerable: true,
get: getter
});
}
};
__webpack_require__.n = function (mole) {
var getter = mole && mole.__esMole ?
function getDefault() {
return mole['default'];
} :
function getMoleExports() {
return mole;
};
__webpack_require__.d(getter, 'a', getter);
return getter;
};
__webpack_require__.o = function (object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
};
__webpack_require__.p = "";
// 載入入口文件
return __webpack_require__(__webpack_require__.s = 0);
})
([
(function (mole, exports, __webpack_require__) {
const a = __webpack_require__(1)
const b = __webpack_require__(2)
}),
(function (mole, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esMole", {value: true});
__webpack_exports__["default"] = ({
a: 1
});
}),
(function (mole, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esMole", {value: true});
__webpack_exports__["default"] = ({
b: 2
});
})
]);
觀察以上代碼得到結果:
1、打包後的代碼是一個立即執行函數,且傳入的參數為一個數組
2、參數數組就是我們引用的模塊
3、每一個模塊對應著數組的位置就是那麼的id
4、在立即函數中載入入口文件,並執行
__webpack_require__ : 載入並執行某一個模塊並將模塊緩存在 installedMoles 中。
moles[moleId].call(mole.exports, mole, mole.exports, __webpack_require__);
這里是執行引用的某一個模塊。
並將mole,exports,require 加入模塊中。
這也是為什麼我們在模塊中有全局變數 mole/exports/require
通過對打包後的文件分析,基本可以完全理解打包過程。
⑹ webpack打包後的文件不知道跑到了哪裡
確實,每次打包從入口開始,會parse所有的依賴,多的時候竟然打包一次要2秒多,簡直不能忍。然而,有幾個解決方案,最有效的,是使用weboack的watch,只有文件md5變化時,才會重新打包,並且只parse有變化的文件,其他沒變化的文件是使用緩存的...
⑺ webpack到底怎麼用
30分鍾手把手教你學webpack實戰
首先對於很多剛接觸webpack人來說,肯定會問webpack是什麼?它有什麼優點?我們為什麼要使用它?帶著這些問題,我們來總結下如下:
Webpack是前端一個工具,可以讓各個模塊進行載入,預處理,再進行打包,它能有Grunt或Gulp所有基本功能。優點如下:
支持commonJS和AMD模塊。
支持很多模塊載入器的調用,可以使模塊載入器靈活定製,比如babel-loader載入器,該載入器能使我們使用ES6的語法來編寫代碼。
可以通過配置打包成多個文件,有效的利用瀏覽器的緩存功能提升性能。
使用模塊載入器,可以支持sass,less等處理器進行打包且支持靜態資源樣式及圖片進行打包。
更多等等。。。帶著這些問題我們慢慢來學習webpack。
https://www.cnblogs.com/tugenhua0707/p/4793265.html
⑻ webpack運行時報這個錯誤怎麼辦
每次打包從入口開始,會parse所有的依賴,多的時候竟然打包一次要2秒多,簡直不能忍。然而,有幾個解決方案,最有效的,是使用weboack的watch,只有文件md5變化時,才會重新打包,並且只parse有變化的文件,其他沒變化的文件是使用緩存的。這樣子,打包時間迅速降到200ms以內。再優化下去的話,我們要知道webpack打包的過程中做了啥,首先是解析依賴啦,然後就是各種各樣的loader。從解析依賴的角度入手,我們可以bowerinstall一些打包好的文件,然後通過設置別名讓依賴指向這個文件,這樣就減去了第三方庫的依賴解析時間。然後各種各樣的loader也是很耗時的,一種法是在loader裡面配include,讓loader只針對特殊資源。