webpack
现代JavaScript应用程序静态模块打包工具。
webpack处理应用程序的时候会在内部构建一个依赖图,映射项目所需的每个模块,生成一个或者多个bundle
核心概念:入口、输出、loader、plugin、模式、
入口 entry
作用:告诉 webpack 应该使用哪个模块作为内部 依赖图
的开始起点。
-
单入口简单语法
module.exports = { entry: "./path/to/my/entry/file.js" };
-
多入口对象语法
module.exports = { entry: { app: "./src/app.js", adminApp: "./src/adminApp.js" } };
输出 output
作用:告诉 webpack 在哪里输出他所创建的 bundle。
默认值:./dist/main.js
-
单个入口输出文件
module.exports = { output: { filename: "bundle.js", path: path.resolve(__dirname, "dist") } };
-
多个入口起点输出文件名称使用
占位符
module.exports = { output: { filename: "[name].js", path: path.resolve(__dirname, "dist") } };
作用: 确保每个文件具有唯一的名称
补充
-
path.resolve(__dirname, 'dist')
- path 是 node 中的内置对象
- path.resolve 是将路径或者路径片段序列解析成绝对路径
- __dirname 指的是当前模块文件所在的完整路径
-
缓存 hash
loader
作用:转换其他类型的模块,让 webpack 能够去处理除了 JavaScript 和 JSON 类型的其他类型文件。
比如:css、less、图片、字体、XML 等文件
方法:在 module.rules
中配置数组,数组每一项都有 test
和 use
module.exports = {
module: {
rules: [{ test: /\.(jpg|png|gif|svg)$/, use: ["file-loader"] }]
}
};
原理:告诉 webpack 当碰到引入’.jpg’ 文件类型的时候,先使用 file-loader 转换一下。
plugin 插件
作用:执行更广泛的任务;包括:打包优化、资源管理、注入环境变量等。
举例:
module.exports = {
plugins: [new HtmlWebpackPlugin({ template: "./src/index.html" })]
};
使用 html-webpack-plugin
这个插件为应用程序生成一个 HTML 文件,并且自动注入所有的 bundle
mode 模式
作用:通过选择 development、production、none 来启用 webpack 在相应的环境下的内置的优化
默认值:production
如何解决webpack加载慢的问题
加载缓慢是指用户用户访问网站后长时间无法显示主要内容和页面
-
加载请求并发
通过插件CommonsChunkPlugin将各个页面用到的模块打包到一个综合的文件Vendor.js中,去降低多次建立连接与并发的问题。
-
启用缓存
原因:用户每一次打开网站,都会从服务器重复的加载相同的资源文件。这样显然也是白白浪费带宽了。
但是开启缓存后,有可能我们更新了代码,但是因为缓存原因,无法同步到新的代码,
因此,我们需要使用 webpack 的 hash 标签来为资源文件进行命名,当文件内容发生改变的时候hash值也会发生变化,就可以更新版本了。
-
按需加载
以页面为单位,进行代码分隔,然后访问到哪个路由时再单独加载。
如何优化webpack的编译速度
-
使用插件整合第三方类库
因为如果不整合的话,每次编译webpack都会重新处理页面中模块的引用关系
所以我们通过CommonsChunkPlugin插件去整合类库。 -
对第三方类库进行预编译
因为,通常类库的代码是不经常变动的,但是webpack每次编译都会去处理这些类库,导致效率很低
所以,我们可以通过插件DllPlugin对类库进行预编译,在需要的时候直接引用编译的结果就好了。 -
开发环境下关闭不必要的Plugins
比如说:对JS进行压缩的 或者 对CSS进行提取的
uglifyjs-webpack-plugin
、extract-text-webpack-plugin
-
生产环境下关闭
source-map
源映射作用:能在编译后的代码中迅速找到对应的源代码的位置
他非常影响代码的编译速度,在生产环境中,我们没有必要在线上追踪调试错误
所以,生产环境的source-map是没必要开启的
gulp 和 webpack 的区别
gulp
- 自动化构建工具,比如:压缩 css、js、编译 less
- gulp 的处理任务需要自己去写
webpack
- 打包工具,对模块打包,预编译模块,处理模块之间的依赖
- 现成的解决方案,只需要在 webpack.config.js 配置好就可以了