webpack常用配置总览(小结)

简介

看《深入浅出webpack》总结一下常用的webpack的属性的含义并加了一些自己的链接,写在一个文件下更能有全局感受,更能理解各个属性中间的关系,重点要关注entry,output,resolve,module, plugins几部分

配置示例

这并不是一个拿来可用的配置,主要是为了更好理解常用的一些webpack属性的作用,所以每一行都有注释,放到一起,更能看到每一个属性在其中的作用

module.exports = {
  // __dirname值为所在文件的目录,context默认为执行webpack命令所在的目录
  context: path.resolve(__dirname, 'app'),
  // 必填项,编译入口,webpack启动会从配置文件开始解析,如下三种(还有一种动态加载entry的方式就是给entry传入一个函数,这个在项目比较大,页面很多的情况下可以优化编译时间)
  entry: './app/entry', // 只有一个入口,入口只有一个文件
  entry: ['./app/entry1', './app/entry2'], // 只有一个入口,入口有两个文件
    // 两个入口
  entry: {
    entry1: './app/entry1',
    entry2: './app/entry2'
  },
  // 输出文件配置
  output: {
    // 输出文件存放的目录,必须是string类型的绝对路径
    path: path.resolve(__dirname, 'dist'),
    // 输出文件的名称
    filename: 'bundle.js',
    filename: '[name].js', // 配置了多个入口entry是[name]的值会被入口的key值替换,此处输出文件会输出的文件名为entry1.js和entry2.js
    filename: [chunkhash].js, // 根据chunk的内容的Hash值生成文件的名称,其他只还有id,hash,hash和chunkhash后面可以使用:number来取值,默认为20位,比如[name]@[chunkhash:12].js,
    // 文件发布到线上的资源的URL前缀,一般用于描述js和css位置,举个例子,打包项目时会导出一些html,那么html里边注入的script和link的地址就是通过这里配置的
    publicPath: "https://cdn.example.com/assets/", // CDN(总是 HTTPS 协议)
    publicPath: "//cdn.example.com/assets/", // CDN (协议相同)
    publicPath: "/assets/", // 相对于服务(server-relative)
    publicPath: "assets/", // 相对于 HTML 页面
    publicPath: "../assets/", // 相对于 HTML 页面
    publicPath: "", // 相对于 HTML 页面(目录相同)
    // 当需要构建的项目可以被其他模块导入使用,会用到libraryTarget和library
    library: 'xxx', // 配置导出库的名称,但是和libraryTarget有关,如果是commonjs2默认导出这个名字就没啥用
    // 从webpack3.1.0开始,可以为每个target起不同的名称
    library: {
      root: "MyLibrary",
      amd: "my-library",
      commonjs: "my-common-library"
    },
    libraryTarget: 'umd', // 导出库的类型,枚举值: umd、commonjs2、commonjs,amd、this、var(默认)、assign、window、global、jsonp(区别查看补充2)
    // 需要单独导出的子模块,这样可以直接在引用的时候使用子模块,默认的时候是_entry_return_
    libraryExport: 'default', // __entry_return_.default
    libraryExport: 'MyModule', // __entry_return_.MyModule
    libraryExport: ['MyModule', 'MySubModule '], // 使用数组代表到指定模块的取值路径 __entry_return_.MyModule.MySubModule
    // 配置无入口的chunk在输出时的文件名称,但仅用于在运行过程中生成的Chunk在输出时的文件名称,这个应该一般和插件的导出有关,支持和filename一样的内置变量
    chunkFilename: '[id].js',
    // 是否包含文件依赖相关的注释信息,不懂?请看补充3,在mode为development的是默认为true
    pathinfo: true,
    // JSONP异步加载chunk,或者拼接多个初始chunk(CommonsChunkPlugin,AggressiveSplittingPlugin)
    jsonpFunction: 'myWebpackJsonp',
    // 此选项会向应盘写入一个输出文件,只在devtool启动了sourceMap选项时采用,默认为`[file].map`,除了和filename一样外还可以使用[file]
    sourceMapFilename: '[file].map',
    // 浏览器开发者工具里显示的源码模块名称,此选项仅在 「devtool 使用了需要模块名称的选项」时使用,使用source-map调试,关联模块鼠标移动到上面的时候显示的地址(截不到图啊,醉了),默认这个值是有的,一般不需要关心
    devtoolModuleFilenameTemplate: 'testtest://[resource-path]'
  },
  // 配置模块相关
  module: {
    rules: [ // 配置loaders
      {
        test: /\.jsx?$/, // 匹配规则,匹配文件使用,一般使用正则表达值
        include: [path.resolve(__dirname, 'app')], // 只会命中这个目录文件
        exclude: [path.resolve(__diranme, 'app/demo-files')], // 命中的时候排除的目录
        use: [ // 使用的loader,每一项为一个loader,从该数组的最后一个往前执行
          'style-loader', // loader的名称,这样则是使用默认配置,可以在后面加!配置属性,也可以用下面方式
          {
            loader: 'css-loader', // loader的名称
            options: {} // loader接受的参数
          }
        ],
        noParse: [ // 不用解析和处理的模块 RegExp | [RegExp] | function(从 webpack 3.0.0 开始)
          /jquery|lodash/
        ]
      }
    ]
  },
  // 配置插件,关于和loader区别见补充4
  plugins: [
   // 压缩js的plugin
   new webpack.optimize.UglifyJsPlugin({
    compress: {
     warnings: false,
     drop_console: false,
    }
   }),
  ],
  // 解析文件引用的模块的配置
  resolve: {
    // 模块的根目录,默认从node_modules开始找
    modules: [
      'node_modules',
      'browser_modules'
    ],
    // 模块的后缀名,我们引入模块有时候不写扩展名,自动补充扩展名的顺序如下
    extensions: ['.js', '.json', '.jsx', '.css'],
    // 模块解析时候的别名
    alias: {
      // 那么导入模块时则可以写import myComponent from '$component/myComponent';
      $component: './src/component',
      // 末尾加$精确匹配
      xyz$: path.resolve(__dirname, 'path/to/file.js')
    },
    // 此选项决定优先使用package.json配置哪份导出文件,详见补充5
    mainFields: ['jsnext:main', 'browser', 'main'],
    // 是否强制导入语句写明后缀
    enforceExtension: false,
    // 是否将符号链接(symlink)解析到它们的符号链接位置(symlink location)
    symlinks: true,
  },
  // 选择一种 source map 格式来增强调试过程。不同的值会明显影响到构建(build)和重新构建(rebuild)的速度。
  devtool: 'source-map',
  // 配置输出代码的运行环境,可以为async-node,electron-main,electron-renderer,node,node-webkit,web(默认),webworker
  target: 'web',
  externals: { // 使用来自于js运行环境提供的全局变量
    jquery: 'jQuery'
  },
  // 控制台输出日志控制
  stats: {
    assets: true, // 添加资源信息
    colors: true, // 控制台日志信息是否有颜色
    errors: true, // 添加错误信息
    errorDetails: true, // 添加错误的详细信息(就像解析日志一样)
    hash: true, // 添加 compilation 的哈希值
  },
  devServer: { // 本地开发服务相关配置
    proxy: { // 代理到后端服务接口
      '/api': 'http://localhost:3000'
    },
    contentBase: path.join(__dirname, 'public'), // 配置devserver http服务器文件的根目录
    compress: true, // 是否开启gzip压缩
    hot: true, // 是否开启模块热交换功能
    https: false, // 是否开启https模式
    historyApiFallback: true, // 是否开发HTML5 History API网页,不太理解TODO
  },
  profile: true, // 是否捕捉webpack构建的性能信息,用于分析是什么原因导致的构建性能不佳
  cache: false, // 缓存生成的 webpack 模块和 chunk,来改善构建速度。缓存默认在观察模式(watch mode)启用。
  cache: {
    // 如果传递一个对象,webpack 将使用这个对象进行缓存。保持对此对象的引用,将可以在 compiler 调用之间共享同一缓存:
    cache: SharedCache // let SharedCache = {}
  },
  watch: true, // 是否启用监听模式
  watchOptions: { // 监听模式选项
    ignored: /node_modules/, // 不监听的文件或文件夹,支持正则匹配,默认为空
    aggregateTimeout: 300, 监听到变化后,300ms再执行动作,节流,防止文件更新频率太快导致重新编译频率太快
    poll: 1000 // 检测文件是否变化,间隔时间
  },
  // 输出文件的性能检查配置
  perfomance: {
    hints: 'warning', // 有性能问题时输出警告
    hints: 'error', // 有性能问题时输出错误
    hints: false, // 关闭性能检查
    maxAssetSize: 200000, // 最大文件大小,单位bytes
    maxEntrypointSize: 400000, // 最大入口文件的大小,单位bytes
    // 此属性允许 webpack 控制用于计算性能提示的文件。
    assetFilter: function(assetFilename) {
      return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
    }
  }
}

补充

补充1.chunkname是什么

就是打包后代码块的名字

补充2.补充不同的库导出方式的区别

var

var MyLibrary = _entry_return_;
// 在一个单独的 script……
MyLibrary.doSomething();

assign 暴露到全局变量中,不要用this 分配给this,感觉会放在全局的this上,官网说取决于你

window 将模块放在window上

window["MyLibrary"] = _entry_return_;

window.MyLibrary.doSomething();

global 调动方式使用global['myLibrary']

commonjs

commonjs2

说一下这两种区别,其实这说到了exports和module.exports的区别,exports是module.exports的一个引用

  module.exports = {};
  exports = module.exports;
  exports['aaaa'] = 1; // 这样是可以的,在module.exports上加了一个属性
  exports = 2; // 会导致exports脱离了对module.exports的引用
  modules.exports = 2 // 这样 exports的至最后就是2

那么其实commonjs的规定就是使用exports进行导出,而我们经常使用module.exports导出,webpack此处的方式其实就是选择到底是用exports导出还是module.exports导出,区别在于
如果选择commonjs

  // webpack输出为
  exports['LibraryName'] = _entry_return_;
  // 使用库的方法为
  require('library-name-in-npm')['LibraryName'].doSomething();
  // 原因其实就是这么导出最后其实是
  // modules.exports = { [LibraryName]: _entry_return_ }

如果选择commonjs2

  // webpack输出为
  module.exports = _entry_return_;
  // 使用库的方法为
  require('library-name-in-npm').doSomething();

amd

// webpack输出
define("MyLibrary", [], function() {
  return _entry_return_; // 此模块返回值,是入口 chunk 返回的值
});
// 使用
require(['MyLibrary'], function(MyLibrary) {
  // 使用 library 做一些事……
});

umd 将你的模块暴露为所有模块定义下都可运行的方式

(function webpackUniversalModuleDefinition(root, factory) {
 if(typeof exports === 'object' && typeof module === 'object')
   module.exports = factory();
 else if(typeof define === 'function' && define.amd)
   define([], factory);
 else if(typeof exports === 'object')
   exports["MyLibrary"] = factory();
 else
   root["MyLibrary"] = factory();
 })(typeof self !== 'undefined' ? self : this, function() {
   return _entry_return_; // 此模块返回值,是入口 chunk 返回的值
 });

jsonp 你的 library 的依赖将由 externals 配置定义。

MyLibrary(_entry_return_);

补充3.pathinfo到底是哪些玩意

补充4.plugins和loader什么区别?

我的理解是

loader使用来识别出特定文件,并转换文件内容,方便webpack使用,比如css文件要解析,需要将其转换成js代码放到js中,才能被后续处理(当然可以省略),然后加入最后输出的js当中
plugin是帮助webpack做一些额外的工作,补充一些webpack本身没有实现的功能,有种打补丁的意思,更专注于打包、编译、输出js文件等操作以及在某些阶段要额外做的一些操作,比如html插件将其链接地址插入html

补充5. 关于mainFields的解释

有一些第三方模块会针对不同的环境提供几份代码,例如分别提供了ES5和ES6两份代码,在package.json中代码如下:

{
  "jsnext:main": "es/index.js", // 采用es6的入口文件
  "main": "lib/index.js", // 采用es5语法的代码入口文件
}

那么webpack会根据mainFields数组里的顺序,逐步找到文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • webpack配置文件和常用配置项介绍

    1.安装webpack 1.全局安装webpack:npm install webpack -g 或者转化了cnpm则将npm改为cnpm进行安装 2.进行初始化建立package.json文件记录插件,命令行:npm init 3.webpack安装到项目并将写入package.json的devDependencies中, 命令行:npm install webpack --save-dev. 2.webpack配置文件介绍 1.webpack需要配置文件webpack.config.js,手

  • webpack常用配置项配置文件介绍

    一.webpack基础 1.在项目中生成package.json:在项目根目录中输入npm init,根据提示输入相应信息.(也可以不生成package.json文件,但是package.json是很有用的,所有建议生成) 2.安装webpaack a.在全局中安装webpack:npm install webpack -g b.将webpack安装到项目并将webpack写入package.json的devDependencies中:进入项目根目录,然后在命令行中输入npm install w

  • 5分钟打造简易高效的webpack常用配置

    webpack给前端开发带来了毋庸置疑的改变,它把JS,图片,css都作为模块处理,同时具有开发便捷,自动化,兼容AMD写法等等诸多无须赘述的优点,更令人称道的是其插件社区非常强大,对于不同的业务需求和技术需求社区都有大量插件可供使用. 凡事都具有两面性,许多人说:前端开发再也不能只需新建HTML文件和JS文件就可以开始写代码了.webpack带来了更高级更规范的前端开发模式,由于其本身也在不断完善中,从1到2再到发布不久的webpack3,频繁的修改给新手带来了许多困惑.而且网络上各种教程鱼目

  • webpack4 从零学习常用配置(小结)

    webpack 的核心价值就是前端源码的打包,即将前端源码中每一个文件(无论任何类型)都当做一个 pack ,然后分析依赖,将其最终打包出线上运行的代码.webpack 的四个核心部分 entry 规定入口文件,一个或者多个 output 规定输出文件的位置 loader 各个类型的转换工具 plugin 打包过程中各种自定义功能的插件 webpack 如今已经进入 v4.x 版本,v5.x 估计也会很快发布.不过看 v5 的变化相比于 v4 ,常用的配置没有变,这是一个好消息,说明基本稳定.

  • webpack常用配置总览(小结)

    简介 看<深入浅出webpack>总结一下常用的webpack的属性的含义并加了一些自己的链接,写在一个文件下更能有全局感受,更能理解各个属性中间的关系,重点要关注entry,output,resolve,module, plugins几部分 配置示例 这并不是一个拿来可用的配置,主要是为了更好理解常用的一些webpack属性的作用,所以每一行都有注释,放到一起,更能看到每一个属性在其中的作用 module.exports = { // __dirname值为所在文件的目录,context默认

  • 分享12个Webpack中常用的Loader(小结)

    目录 前言 style-loader css-loader sass-loader postcss-loader babel-loader ts-loader html-loader file-loader url-loader html-withimg-loader vue-loader eslint-loader 总结 前言 初衷: 整理一些常用的loader分享给大家,方便知道在什么场景下该用什么loader.如果有大佬都懂悄悄左滑就行,不喜勿喷. 适合人群: 前端初级开发. style-

  • PyCharm常用配置和常用插件(小结)

    常用配置 以下配置能使用File -> New Projects Settings -> Settings for New Projects进行配置的尽量用这个配置,因为这个配置是作用于所有新建项目的,不能用的选择File -> Settings 配置Python解释器 文件编码 文件和代码模板 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @author JourWon # @date ${DATE} # @file ${NAME}.p

  • React + webpack 环境配置的方法步骤

    本文介绍了React + webpack 环境配置的方法步骤,分享给大家,具体如下: 安装配置Babel babel-preset-es2015 ES6语法包,使代码可以随意地使用ES6的新特性. babel-preset-react React语法包,专门用于React的优化,在代码中可以使用React ES6 classes的写法,同时直接支持JSX语法格式 安装Babel loader // 安装babel-core核心模块和babel-loader npm install babel-c

  • spring boot 的常用注解使用小结

    @RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet.使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而专门的@RestController. 当你实现一个RESTful web services的时候,response将一直通过response

  • webpack 最佳配置指北(推荐)

    前言 对于入门选手来讲,webpack 配置项很多很重,如何快速配置一个可用于线上环境的 webpack 就是一件值得思考的事情.其实熟悉 webpack 之后会发现很简单,基础的配置可以分为以下几个方面: entry . output . mode . resolve . module . optimization . plugin . source map . performance 等,本文就来重点分析下这些部分. 内有一张webpack零配置对比图片,在公众号后台回复[webpack]免

  • Nginx各个模块的配置及常用配置选项

    目录 Nginx Location配置 请求转发和重定向 Nginx静态文件配置 文件下载服务器 Nginx配置HTTPS Nginx日志配置 Nginx超时设置 请求超时设置 Proxy反向代理超时设置 Nginx负载均衡 轮询(默认) 权重(weight) ip_hash url_hash fair(第三方) Nginx与uWSGI服务器的沟通 小结 接下来,我们仔细分析下Nginx各个模块的配置选项.注意:http块也可以进一步分成3块,http全局块里的配置对所有站点生效,server块

  • 基于Docker的几种常用CentOS7镜像小结

    目录 1 安装 Docker 2 配置国内镜像源 3 制作中文环境基础版Centos7镜像 3.1 Dockerfile 3.2 启动容器 3.3 在容器中安装配置一些基础服务 3.4 SSH 3.5 [可选]修改容器配置 3.5.1 通过容器的配置文件 3.5.2 通过 docker commit 方式 3.6 制作为本地镜像 3.7 镜像提交到阿里云镜像库 3.8 使用提交到阿里云的镜像 4 开发环境版 Centos7 镜像 4.1 JDK 4.2 Git 4.3 Maven 4.4 Ngi

随机推荐