Webpack 配置详解及实现过程

Webpack 配置详解

一、打包升级

1.基础打包配置

1. 开发模式(devtool)

demo_base版本

This option controls if and how source maps are generated.

开发建议使用eval模式,缺点是无法正确显示行号,想要正确显示行号,可以时候用source-map或者eval-source-map

生产环境: 建议使用cheap-module-source-map

2. 入口配置(entry)

string | [string] | object { <key>: string | [string] } | (function: () => string | [string] | object { <key>: string | [string] })

入口打包根场景不同,入口配置也不同。

  • 单入口:

entry: './A/index.js'

entry: [
'./A/index.js',],
  • 多入口:

entry: [
'./A/index.js','./B/index.js'
],entry: {
A: './A/index.js',B: './B/index.js'
}

3. 输出配置(output)

  • 输出路径配置:

    output: {
        // path.resolve用来拼接文件多级目录
        // __dirname 为当前文件所在全路径地址
        path: path.resolve(__dirname,'dist'),// 输出文件名字
       // filename: 'app.js',// 以key作为文件名输出
        filename: '[name].js',// chunkhash 根据文件内容生成特点的hash,使用这个可以保证文件内容不变,那么文件名字就不会改变,可以用来作为热更新
        chunkFilename: '[chunkhash].js'
    }

4. resolve

Configure how modules are resolved. For example,when calling import "lodash" in ES2015,the resolve options can change where webpack goes to look for "lodash" (see modules).

resolve: {
        // 当你reuire时,不需要加上以下扩展名
        extensions: ['.js','.md','.txt'],},

5. 插件(plugin)

plugins: [
    // Webpack 2以后内置
    // new webpack.optimize.OccurrenceOrderPlugin(),// 碰到错误warning但是不停止编译
    new webpack.NoEmitOnErrorsPlugin(),// 开发模式不需要压缩
    // new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }),

6. moudles

* babel-loader(用来做js代码转化)
* style-loader & css-loader(用来转化css代码)
* less-loader 转化less文件
* raw-loader 把文件当做普通的文本文件读取
* json-loader webpack 2以后就不需要配置了(内置了)
* url-loader 用来处理eot|woff|woff2|ttf|svg|png|jpg这些文件,可以防止加载资源文件导致页面加载缓慢
* file-loader 用来处理文件,可以用url-loader代替,但是如果你资源文件是即时文件,那么就使用file-loader

2.多入口打多个包 (生成多个bundle.js)

这个是webpack 3.1.0新出来的配置方式,可以用来解决多个入口文件,打包成多个文件夹的问题。

demo 将多个入口打成多个文件夹

module.exports = [{
  output: {
    filename: './dist-amd.js',libraryTarget: 'amd'
  },entry: './app.js',{
  output: {
    filename: './dist-commonjs.js',libraryTarget: 'commonjs'
  },}]

3.兼容多浏览器,添加postcss-loader(生产环境使用,增加build和rebuild时间)

demo 添加postcss

添加postcss-loader,需要做如下配置

webpack config 配置

插件配置

{
        test: /\.less/,use: [
          'style-loader','css-loader',+          'postcss-loader','less-loader'
        ]
      },{
        test: /\.css$/,-        use: 'style-loader!css-loader',+        use: 'style-loader!css-loader!postcss-loader',
.postcss.config.js文件配置
module.exports = {
  plugins: {
    'postcss-import': {},// 能够使用import语法 @import "cssrecipes-defaults"; 
    'postcss-cssnext': {},//PostCSS-cssnext是一个PostCSS插件,可以帮助您使用最新的CSS语法。 它将CSS规范转换为更兼容的CSS,因此您不需要等待浏览器支持。
    'cssnano': {}
  }
}

4.css文件抽离 (生成环境使用,会增加build和rebuild时间)

demo css文件分离

webpack config 配置

插件配置

+const ExtractTextPlugin = require('extract-text-webpack-plugin');

+new ExtractTextPlugin('style.css'),//名字配置
    { 
        test: /\.less/,_        use: [
_          'style-loader',_          'css-loader',_          'less-loader'
_        ]
+        use: ExtractTextPlugin.extract({
+          fallback: 'style-loader',+          use: ['css-loader','less-loader']
+        })
      },+         use: ExtractTextPlugin.extract({
+          fallback: 'style-loader',+          use: ['css-loader']
+        })
      },//PostCSS-cssnext是一个PostCSS插件,可以帮助您使用最新的CSS语法。 它将CSS规范转换为更兼容的CSS,因此您不需要等待浏览器支持。
    'cssnano': {}
  }
}

5.公共文件抽取 (抽取公共文件,可以减少build与rebuild时间)

公共文件抽取一般依靠 CommonChunkPlguin 和 Dllplugin这两个插件.

CommonChunkPlugin Demo

DllPlugin Demo

  • 共同点:

    • 都可以抽出公共模块

  • 不同点:

    • CommonChunkPlguin

      1. CommonChunkPlguin可以抽出多个模块间公共模块

      2. 配置了HtmlWebpackPlugin后,不需要手动在html中导入

    • dllPlugin

      1. dllPlugin 可以在multi compliler(多个webpack config 文件) 中使用

      2. dllPlugin 生成的文件相当于独立的存在,就像jQuery一样,需要你在html进行引入之后才能使用。

CommonChunkPlugin 配置:

// 如果有其他CommonsChunkPlugin生成的文件,将会引入
  // - If chunk has the name as specified in the chunkNames it is put in the list
  // - If no chunk with the name as given in chunkNames exists a new chunk is created and added to the list
 // 大概意思就是如果name在entry里面有,那就加入一个列表,如果entry里面没有,
 // 那么就创建一个新chunk列表,如果chunks里面相同模块代码出现次数超过minChunks,那就添加到这个新创建的list里面。
 new webpack.optimize.CommonsChunkPlugin({
      name: "common",chunks: ["a","b"],//需要合并的文件
      // minChunks:3 //最少在出现过多少次才将其打入common中
    }),//如果
    new webpack.optimize.CommonsChunkPlugin({
      name: "vendor",minChunks: Infinity 
    })

DllPlugin 配置:

添加文件
const webpackConfig = {
  name: "vendor",entry: ["react","react-dom"],output: {
    path: buildPath,// 输出文件路径
    filename: "vendor.js",library: "vendor_[hash]"
  },plugins: [
    new webpack.DllPlugin({
      name: "vendor_[hash]",path: path.resolve(buildPath,"manifest.json")
    })
  ]
};
name: "app",+ dependencies: ["vendor"],devtool: 'eval',+  new webpack.DllReferencePlugin({
+     manifest: path.resolve(buildPath,"manifest.json")
+    }),

6.文件分析(visualizer)

文件分析可以插件可以帮助查看我们生成的bundle.js和chunk的组成成分,可以根据这个进行代码优化。(开发环境使用)

+    const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin;
+    const Visualizer = require('webpack-visualizer-plugin');

+   new StatsWriterPlugin({
+      fields: null,+      stats: { chunkModules: true }
+    }),+    new Visualizer({
+      filename: './statistics.html' // visualizer 文件名称,在output 设置的path文件夹可以找到
+    })

7.DefinePlugin(生产环境配置可以减少文件体积)

这个减少文件体积是相对的,webpack打包的时候回删去无用的代码,而react-dom等一些文件中都有很多下面的代码形式,这样webpack 和 DefinePlugin插件配合可以减少部分文件体积

if (process.env.NODE_ENV !== 'production') {}
new webpack.DefinePlugin({
  'process.env': {
    NODE_ENV: JSON.stringify('production')
  }
}),

8.OccurrenceOrderPlugin内置加入,不需要配置

9.UglifyJsPlugin(压缩文件,减小文件体积,生产环境使用)

webpack 本身内置uglifyjs,如果你想控制uglifyjs的版本,可以使用这个。

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
 new uglifyJsPlugin({
      compress: {
        warnings: false
      }
    })

10.热替换配置(开发环境自动刷新)

篇幅过大,移至此文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom