配置

webpack 开箱即用,可以无需使用任何配置文件。然而,webpack 会假定项目的入口起点为 src/index,然后会在 dist/main.js 输出结果,并且在生产环境开启压缩和优化。

通常,你的项目还需要继续扩展此能力,为此你可以在项目根目录下创建一个 webpack.config.js 文件,webpack 会自动使用它。

下面指定了所有可用的配置选项。

刚开始学习 webpack?请查看我们提供的指南,从 webpack 一些 核心概念 开始学习吧!

选项

点击下面配置代码中每个选项的名称,跳转到详细的文档。还要注意,带有箭头的项目可以展开,以显示更多示例,在某些情况下可以看到高级配置。

注意整个配置中我们使用 Node 内置的 path 模块,并在它前面加上 __dirname这个全局变量。可以防止不同操作系统之间的文件路径问题,并且可以使相对路径按照预期工作。更多「POSIX 和 Windows」的相关信息请查看此章节

webpack.config.js

  1. const path = require('path');
  2. module.exports = {
  3. mode: "production", // "production" | "development" | "none" mode: "production", // enable many optimizations for production builds
  4. mode: "development", // enabled useful tools for development
  5. mode: "none", // no defaults
  6. // Chosen mode tells webpack to use its built-in optimizations accordingly.
  7. entry: "./app/entry", // string | object | array entry: ["./app/entry1", "./app/entry2"],
  8. entry: {
  9. a: "./app/entry-a",
  10. b: ["./app/entry-b1", "./app/entry-b2"]
  11. },
  12. // 默认为 './src'
  13. // 这里应用程序开始执行
  14. // webpack 开始打包
  15. output: {
  16. // webpack 如何输出结果的相关选项
  17. path: path.resolve(__dirname, "dist"), // string
  18. // 所有输出文件的目标路径
  19. // 必须是绝对路径(使用 Node.js 的 path 模块)
  20. filename: "bundle.js", // string filename: "[name].js", // 用于多个入口点(entry point)(出口点?)
  21. filename: "[chunkhash].js", // 用于长效缓存
  22. // 「入口分块(entry chunk)」的文件名模板
  23. publicPath: "/assets/", // string publicPath: "",
  24. publicPath: "https://cdn.example.com/",
  25. // 输出解析文件的目录,url 相对于 HTML 页面
  26. library: "MyLibrary", // string,
  27. // 导出库(exported library)的名称
  28. libraryTarget: "umd", // 通用模块定义 libraryTarget: "umd2", // 通用模块定义
  29. libraryTarget: "commonjs2", // exported with module.exports
  30. libraryTarget: "commonjs", // 作为 exports 的属性导出
  31. libraryTarget: "amd", // 使用 AMD 定义方法来定义
  32. libraryTarget: "this", // 在 this 上设置属性
  33. libraryTarget: "var", // 变量定义于根作用域下
  34. libraryTarget: "assign", // 盲分配(blind assignment)
  35. libraryTarget: "window", // 在 window 对象上设置属性
  36. libraryTarget: "global", // property set to global object
  37. libraryTarget: "jsonp", // jsonp wrapper
  38. // 导出库(exported library)的类型
  39. /* 高级输出配置(点击显示) */ pathinfo: true, // boolean
  40. // 在生成代码时,引入相关的模块、导出、请求等有帮助的路径信息。
  41. chunkFilename: "[id].js",
  42. chunkFilename: "[chunkhash].js", // 长效缓存(/guides/caching)
  43. // 「附加分块(additional chunk)」的文件名模板
  44. jsonpFunction: "myWebpackJsonp", // string
  45. // 用于加载分块的 JSONP 函数名
  46. sourceMapFilename: "[file].map", // string
  47. sourceMapFilename: "sourcemaps/[file].map", // string
  48. // 「source map 位置」的文件名模板
  49. devtoolModuleFilenameTemplate: "webpack:///[resource-path]", // string
  50. // 「devtool 中模块」的文件名模板
  51. devtoolFallbackModuleFilenameTemplate: "webpack:///[resource-path]?[hash]", // string
  52. // 「devtool 中模块」的文件名模板(用于冲突)
  53. umdNamedDefine: true, // boolean
  54. // 在 UMD 库中使用命名的 AMD 模块
  55. crossOriginLoading: "use-credentials", // 枚举
  56. crossOriginLoading: "anonymous",
  57. crossOriginLoading: false,
  58. // 指定运行时如何发出跨域请求问题
  59. /* 专家级输出配置(自行承担风险) */ devtoolLineToLine: {
  60. test: /\.jsx$/
  61. },
  62. // 为这些模块使用 1:1 映射 SourceMaps(快速)
  63. hotUpdateMainFilename: "[hash].hot-update.json", // string
  64. // 「HMR 清单」的文件名模板
  65. hotUpdateChunkFilename: "[id].[hash].hot-update.js", // string
  66. // 「HMR 分块」的文件名模板
  67. sourcePrefix: "\t", // string
  68. // 包内前置式模块资源具有更好可读性
  69. },
  70. module: {
  71. // 关于模块配置
  72. rules: [
  73. // 模块规则(配置 loader、解析器等选项)
  74. {
  75. test: /\.jsx?$/,
  76. include: [
  77. path.resolve(__dirname, "app")
  78. ],
  79. exclude: [
  80. path.resolve(__dirname, "app/demo-files")
  81. ],
  82. // 这里是匹配条件,每个选项都接收一个正则表达式或字符串
  83. // test 和 include 具有相同的作用,都是必须匹配选项
  84. // exclude 是必不匹配选项(优先于 test 和 include)
  85. // 最佳实践:
  86. // - 只在 test 和 文件名匹配 中使用正则表达式
  87. // - 在 include 和 exclude 中使用绝对路径数组
  88. // - 尽量避免 exclude,更倾向于使用 include
  89. issuer: { test, include, exclude },
  90. // issuer 条件(导入源)
  91. enforce: "pre",
  92. enforce: "post",
  93. // 标识应用这些规则,即使规则覆盖(高级选项)
  94. loader: "babel-loader",
  95. // 应该应用的 loader,它相对上下文解析
  96. // 为了更清晰,`-loader` 后缀在 webpack 2 中不再是可选的
  97. // 查看 webpack 1 升级指南。
  98. options: {
  99. presets: ["es2015"]
  100. },
  101. // loader 的可选项
  102. },
  103. {
  104. test: /\.html$/,
  105. use: [
  106. // 应用多个 loader 和选项
  107. "htmllint-loader",
  108. {
  109. loader: "html-loader",
  110. options: {
  111. /* ... */
  112. }
  113. }
  114. ]
  115. },
  116. { oneOf: [ /* rules */ ] },
  117. // 只使用这些嵌套规则之一
  118. { rules: [ /* rules */ ] },
  119. // 使用所有这些嵌套规则(合并可用条件)
  120. { resource: { and: [ /* 条件 */ ] } },
  121. // 仅当所有条件都匹配时才匹配
  122. { resource: { or: [ /* 条件 */ ] } },
  123. { resource: [ /* 条件 */ ] },
  124. // 任意条件匹配时匹配(默认为数组)
  125. { resource: { not: /* 条件 */ } }
  126. // 条件不匹配时匹配
  127. ],
  128. /* 高级模块配置(点击展示) */ noParse: [
  129. /special-library\.js$/
  130. ],
  131. // 不解析这里的模块
  132. unknownContextRequest: ".",
  133. unknownContextRecursive: true,
  134. unknownContextRegExp: /^\.\/.*$/,
  135. unknownContextCritical: true,
  136. exprContextRequest: ".",
  137. exprContextRegExp: /^\.\/.*$/,
  138. exprContextRecursive: true,
  139. exprContextCritical: true,
  140. wrappedContextRegExp: /.*/,
  141. wrappedContextRecursive: true,
  142. wrappedContextCritical: false,
  143. // specifies default behavior for dynamic requests
  144. },
  145. resolve: {
  146. // 解析模块请求的选项
  147. // (不适用于对 loader 解析)
  148. modules: [
  149. "node_modules",
  150. path.resolve(__dirname, "app")
  151. ],
  152. // 用于查找模块的目录
  153. extensions: [".js", ".json", ".jsx", ".css"],
  154. // 使用的扩展名
  155. alias: {
  156. // 模块别名列表
  157. "module": "new-module",
  158. // 起别名:"module" -> "new-module" 和 "module/path/file" -> "new-module/path/file"
  159. "only-module$": "new-module",
  160. // 起别名 "only-module" -> "new-module",但不匹配 "only-module/path/file" -> "new-module/path/file"
  161. "module": path.resolve(__dirname, "app/third/module.js"),
  162. // 起别名 "module" -> "./app/third/module.js" 和 "module/file" 会导致错误
  163. // 模块别名相对于当前上下文导入
  164. },
  165. /* 可供选择的别名语法(点击展示) */ alias: [
  166. {
  167. name: "module",
  168. // 旧的请求
  169. alias: "new-module",
  170. // 新的请求
  171. onlyModule: true
  172. // 如果为 true,只有 "module" 是别名
  173. // 如果为 false,"module/inner/path" 也是别名
  174. }
  175. ],
  176. /* 高级解析选项(点击展示) */ symlinks: true,
  177. // 遵循符号链接(symlinks)到新位置
  178. descriptionFiles: ["package.json"],
  179. // 从 package 描述中读取的文件
  180. mainFields: ["main"],
  181. // 从描述文件中读取的属性
  182. // 当请求文件夹时
  183. aliasFields: ["browser"],
  184. // 从描述文件中读取的属性
  185. // 以对此 package 的请求起别名
  186. enforceExtension: false,
  187. // 如果为 true,请求必不包括扩展名
  188. // 如果为 false,请求可以包括扩展名
  189. moduleExtensions: ["-module"],
  190. enforceModuleExtension: false,
  191. // 类似 extensions/enforceExtension,但是用模块名替换文件
  192. unsafeCache: true,
  193. unsafeCache: {},
  194. // 为解析的请求启用缓存
  195. // 这是不安全,因为文件夹结构可能会改动
  196. // 但是性能改善是很大的
  197. cachePredicate: (path, request) => true,
  198. // predicate function which selects requests for caching
  199. plugins: [
  200. // ...
  201. ]
  202. // 应用于解析器的附加插件
  203. },
  204. performance: {
  205. hints: "warning", // 枚举 hints: "error", // 性能提示中抛出错误
  206. hints: false, // 关闭性能提示
  207. maxAssetSize: 200000, // 整数类型(以字节为单位)
  208. maxEntrypointSize: 400000, // 整数类型(以字节为单位)
  209. assetFilter: function(assetFilename) {
  210. // 提供资源文件名的断言函数
  211. return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
  212. }
  213. },
  214. devtool: "source-map", // enum devtool: "inline-source-map", // 嵌入到源文件中
  215. devtool: "eval-source-map", // 将 SourceMap 嵌入到每个模块中
  216. devtool: "hidden-source-map", // SourceMap 不在源文件中引用
  217. devtool: "cheap-source-map", // 没有模块映射(module mappings)的 SourceMap 低级变体(cheap-variant)
  218. devtool: "cheap-module-source-map", // 有模块映射(module mappings)的 SourceMap 低级变体
  219. devtool: "eval", // 没有模块映射,而是命名模块。以牺牲细节达到最快。
  220. // 通过在浏览器调试工具(browser devtools)中添加元信息(meta info)增强调试
  221. // 牺牲了构建速度的 `source-map' 是最详细的。
  222. context: __dirname, // string(绝对路径!)
  223. // webpack 的主目录
  224. // entry 和 module.rules.loader 选项
  225. // 相对于此目录解析
  226. target: "web", // 枚举 target: "webworker", // WebWorker
  227. target: "node", // node.js 通过 require
  228. target: "async-node", // Node.js 通过 fs 和 vm
  229. target: "node-webkit", // nw.js
  230. target: "electron-main", // electron,主进程(main process)
  231. target: "electron-renderer", // electron,渲染进程(renderer process)
  232. target: (compiler) => { /* ... */ }, // 自定义
  233. // bundle 应该运行的环境
  234. // 更改 块加载行为(chunk loading behavior) 和 可用模块(available module)
  235. externals: ["react", /^@angular\//], externals: "react", // string(精确匹配)
  236. externals: /^[a-z\-]+($|\/)/, // 正则
  237. externals: { // 对象
  238. angular: "this angular", // this["angular"]
  239. react: { // UMD
  240. commonjs: "react",
  241. commonjs2: "react",
  242. amd: "react",
  243. root: "React"
  244. }
  245. },
  246. externals: (request) => { /* ... */ return "commonjs " + request }
  247. // 不要遵循/打包这些模块,而是在运行时从环境中请求他们
  248. serve: { //object
  249. port: 1337,
  250. content: './dist',
  251. // ...
  252. },
  253. // 为 webpack-serve 提供选项
  254. stats: "errors-only", stats: { //object
  255. assets: true,
  256. colors: true,
  257. errors: true,
  258. errorDetails: true,
  259. hash: true,
  260. // ...
  261. },
  262. // 精确控制要显示的 bundle 信息
  263. devServer: {
  264. proxy: { // proxy URLs to backend development server
  265. '/api': 'http://localhost:3000'
  266. },
  267. contentBase: path.join(__dirname, 'public'), // boolean | string | array, static file location
  268. compress: true, // enable gzip compression
  269. historyApiFallback: true, // true for index.html upon 404, object for multiple paths
  270. hot: true, // hot module replacement. Depends on HotModuleReplacementPlugin
  271. https: false, // true for self-signed, object for cert authority
  272. noInfo: true, // only errors & warns on hot reload
  273. // ...
  274. },
  275. plugins: [
  276. // ...
  277. ],
  278. // 附加插件列表
  279. /* 高级配置(点击展示) */ resolveLoader: { /* 等同于 resolve */ }
  280. // 独立解析选项的 loader
  281. parallelism: 1, // number
  282. // 限制并行处理模块的数量
  283. profile: true, // boolean
  284. // 捕获时机信息
  285. bail: true, //boolean
  286. // 在第一个错误出错时抛出,而不是无视错误。
  287. cache: false, // boolean
  288. // 禁用/启用缓存
  289. watch: true, // boolean
  290. // 启用观察
  291. watchOptions: {
  292. aggregateTimeout: 1000, // in ms
  293. // 将多个更改聚合到单个重构建(rebuild)
  294. poll: true,
  295. poll: 500, // 间隔单位 ms
  296. // 启用轮询观察模式
  297. // 必须用在不通知更改的文件系统中
  298. // 即 nfs shares(译者注:Network FileSystem,最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 ( share file ))
  299. },
  300. node: {
  301. // Polyfills and mocks to run Node.js-
  302. // environment code in non-Node environments.
  303. console: false, // boolean | "mock"
  304. global: true, // boolean | "mock"
  305. process: true, // boolean
  306. __filename: "mock", // boolean | "mock"
  307. __dirname: "mock", // boolean | "mock"
  308. Buffer: true, // boolean | "mock"
  309. setImmediate: true // boolean | "mock" | "empty"
  310. },
  311. recordsPath: path.resolve(__dirname, "build/records.json"),
  312. recordsInputPath: path.resolve(__dirname, "build/records.json"),
  313. recordsOutputPath: path.resolve(__dirname, "build/records.json"),
  314. // TODO
  315. }

Use custom configuration file

If for some reason you want to use custom configuration file depending on certain situations you can change this via command line by using the --config flag.

package.json

  1. "scripts": {
  2. "build": "webpack --config prod.config.js"
  3. }

Configuration file generators

Want to rapidly generate webpack configuration file for your project requirements with just a few clicks away?

Generate Custom Webpack Configuration is an interactive portal you can play around by selecting custom webpack configuration options tailored for your frontend project. It automatically generates a minimal webpack configuration based on your selection of loaders/plugins, etc.

Visual tool for creating webpack configs is an online configuration tool for creating webpack configuration file where you can select any combination of features you need. It also generates a full example project based on your webpack configs.


贡献人员

bondz bondz byzyk byzyk dasarianudeep dasarianudeep grgur grgur jeremenichelli jeremenichelli kbariotis kbariotis kennetvu kennetvu mattce mattce skipjack skipjack sokra sokra sricc sricc sterlingvix sterlingvix terinjokes terinjokes