步骤
1.传统项目中的问题
在不依赖任何自动化、模块化工具的项目中,通常我们的代码是这样的:
index.html
<html> <head> <title>传统项目</title> <script src="https://code.jquery.com/jquery-2.2.4.js"></script> </head> <body> <script src="app/index.js"></script> </body></html>app/index.js
function main() { $("body").html("hello world!");}main();以上示例中,脚本之间存在着隐式依赖关系。
mkdir demo && cd demo // 新建demo文件夹并打开npm init // 初始化npm,生成package.json配置文件npm install --save-dev webpack@beta // 安装webpack2.0版本,mac系统可能需要添加sudo命令以上使用的npm命令需要安装node.js,可以点击这里安装即可:node.js
npm install --save jQuery // 安装jQuery
var $ = require("jquery");function main() { $("body").html("hello world!");}main();这里我们可以直接在index.js里引用jQuery,index.js明确要求jQuery的存在,这样就不存在隐式依赖的问题(没有全局污染)。
<html> <head> <title>webpack项目</title> </head> <body> <script src="dist/bundle.js"></script> </body></html>这里我们的index.html文件只引入了最终打包后的bundle.js。现在运行webpack命令将index.js输出为bundle.js。
webpack app/index.js dist/bundle.jsHash: 3bb91a6dedfc2a2a1c08Version: webpack 2.2.0-rc.4Time: 397ms Asset Size Chunks Chunk Namesbundle.js 270 kB 0 [emitted] [big] main [0] ./~/jquery/dist/jquery.js 267 kB {0} [built] [1] ./app/index.js 83 bytes {0} [built]最终我们在浏览器中打开index.html页面可以看到输出的“hello world!”。
4.拆分
现在如果我们index.js中的”hello world!”字符串需要放到另外一个hello.js中,然后在index.js中引入使用的话,这就涉及到webpack模块拆分的功能。
app/index.js
var $ = require("jquery");var str = require("./hello.js");function main() { $("body").html(str);}main();app/hello.js
var str = "hello world!";module.exports = str;我们在hello.js中通过module.exports导出str变量,然后在index.js通过require导入同样可以实现浏览器中输入“hello world!”的效果,当然我们需要重新运行下webpack命令:webpack app/index.js dist/bundle.js
webpack app/index.js dist/bundle.js
module.exports = { entry: "./app/index.js", output: { filename: "bundle.js", path: "./dist" }}上方配置中的entry就是我们的入口文件,可以有多个入口文件,而output即为webpack打包的输入对象,filename为输出文件名,path为输出路径。
webpack --config webpack.config.js
webpack
webpack -p
webpackHash: ab4a1091f0880100eab0Version: webpack 2.2.0-rc.4Time: 387ms Asset Size Chunks Chunk Namesbundle.js 270 kB 0 [emitted] [big] main [0] ./app/hello.js 50 bytes {0} [built] [1] ./~/jquery/dist/jquery.js 267 kB {0} [built] [2] ./app/index.js 114 bytes {0} [built]输出的bundle.js整个文件大小为270 kB。
webpack -pHash: ab4a1091f0880100eab0Version: webpack 2.2.0-rc.4Time: 1967ms Asset Size Chunks Chunk Namesbundle.js 88.3 kB 0 [emitted] main [0] ./app/hello.js 50 bytes {0} [built] [1] ./~/jquery/dist/jquery.js 267 kB {0} [built] [2] ./app/index.js 114 bytes {0} [built]输出的bundle.js整个文件大小为88.3 kB。
var webpack = require("webpack");module.exports = { ... plugins:[ // 去除代码块内的告警语句 new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), // 优先考虑使用最多的模块,并为它们分配最小的ID new webpack.optimize.OccurenceOrderPlugin() ] ...}而本示例中使用的是webpack2.0版本,在2.0中UglifyJsPlugin的compress选项默认为false,并且OccurrenceOrderPlugin默认启用,所以无需进行配置。