webpack4入门学习笔记(四)--Tree Shaking与拆分配置文件

栏目: 编程语言 · 发布时间: 7年前

内容简介:笔记的代码是在前面笔记基础上修改的,可以需要注意的是要让

系列博客链接

笔记的代码是在前面笔记基础上修改的,可以 下载代码:github 参考或是先看前面的笔记。

Tree Shaking 使用

Tree Shaking 可以用来剔除 JavaScript 中用不上的死代码。它依赖静态的 ES6 模块化语法,例如通过 import 和 export 导入导出。

需要注意的是要让 Tree Shaking 正常工作的前提是 JavaScript 代码必须采用 ES6 模块化语法,因为 ES6 模块化语法是静态的,这让 Webpack 可以简单的分析出哪些 export 的被 import 过了。

接下来配置 Webpack 让 Tree Shaking 生效

webpack4 默认保留ES6模块化语句,并没有通过Babel将其转换

修改 .babelrc 文件为如下:

//.babelrc

{
   "presets": [["@babel/preset-env",{
      "useBuiltIns": "usage",
      "corejs": 2,
      "modules":false //关闭 Babel 的模块转换功能,保留原本的 ES6 模块化语法
      //默认是auto,取值还可以是 amd, umd, systemjs, commonjs,auto等
   }]]
}

修改 webapck.config.js ,添加

optimization: {
  usedExports: true
}

到 module.exports{} 中

module.exports={
 mode: 'development',
  optimization: {
  //开发坏境使用tree shaking时加usedExports: true
    usedExports: true 
  },
}

还需通过 package.json 的 "sideEffects" 属性来告诉webpack哪些模块是可以忽略掉,如果没有则设置为 false ,来告知webpack,它可以安全地删除未用到的 export 。

修改 package.json

{
  "name": "your-project",
  "sideEffects": false
}

有的模块没有导出模块,在 Tree Shaking 模式下就会被忽略,所以我们需要把这些模块做处理,不需要 Tree Shaking 对这些模块进行处理,可以改为一个数组:

{
  "name": "your-project",
  "sideEffects": ["*.css"]
}

"sideEffects": ["*.css"] 表示不对所以css模块使用 Tree Shaking 处理。

index.js

//tree shaking import export
import {cube} from './math.js'

let component = () => {
  let element = document.createElement('pre')
  element.innerHTML = [
    'Hello webpack!',
    '2 cubed is equal to ' + cube(2)
  ].join('\n\n');
  console.log(cube)
  
  return element;
}
document.body.appendChild(component());

main.js

export let square= (x) => {
  console.log(x)
  return x * x;
}

export let cube = (x) => {
  console.log(x)
  return x * x * x;
}

运行 npm run build ,然后打开打包后的js文件:main.js找到下面这段文字

/*!*********************!*\
   !*** ./src/math.js ***!
   \*********************/
 /*! exports provided: square, cube */
 /*! exports used: cube */
 /***/

从上面这段文字可以看出 Tree Shaking 生效了,但是在开发环境下,并没有把没有用的代码删掉,因为环境下还需要对代码进行调试。

我们已经找出需要删除的“未引用代码(dead code)”,然而,不仅仅是要找出,还要删除它们。为此,我们需要将 mode 配置选项设置为 production ,将optimization对象删掉,修改 devtool 配置选项

webpack.config.js

module.exports = {
  mode: 'production',
  devtool: 'cheap-module-source-map'
}

运行 npm run build ,查看打包结果就可以看到没有用的代码被删掉了。

Tree Shaking 参考代码下载链接:github(demo4)

Develoment 和 Production 不同环境的配置

因为在不同的环境下,webpack的配置稍微有点区别,如果我们需要在不同的换将下切换,就得修改webpack配置,这是很麻烦而且还容易改错,所以我们需要把配置文件进行拆分。

在项目根目录下新建build文件夹,然后在build文件夹中新建 webpack.dev.js 、 webpack.prod.js 和 webpack.base.js 三个文件

webpack.dev.js :是开发环境

webpack.prod.js :是生产环境

webpack.base.js :是开发环境和生产环境都用到的配置

这几个文件之间的结合靠'webpack-merge'这个插件。

安装

npm i webpack-merge -D

//webpack.dev.js

const webpack=require('webpack')
const merge = require('webpack-merge')
const baseConfig=require('./webpack.base')

const devConfig={
  mode: 'development', 
  devtool: 'cheap-module-eval-source-map',
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ],
  optimization: {
    usedExports: true
  },
  devServer: {
    contentBase: './dist',
    // open: true, //自动打开浏览器
    // port: 8080,
    hot: true, //启用webpack的热模块替换功能
    //hotOnly: true 
    //devServer.hot在没有页面刷新的情况下启用热模块替换作为构建失败时的后备
  }
}

module.exports=merge(baseConfig,devConfig)
//webapck.prod.js

const merge = require('webpack-merge')
const baseConfig=require('./webpack.base')

const prodConfig={
  mode: 'production', 
  devtool: 'cheap-module-source-map'
}

module.exports=merge(baseConfig,prodConfig)

但是这两个文件还有大量重复的代码,新建 webpack.base.js

//webpack.base.js

const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
const cleanWebpackPlugin = require('clean-webpack-plugin')

module.exports={
  entry: {
    main: './src/index.js'
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname,'dist')
  },
  module: {
    rules:[
      {
        test: /\.(png|jpg|gif)$/,
        use: {
          loader: 'url-loader',
          options: {
            name: '[name].[ext]', 
            outputPath: 'images/', 
            limit: 2048           
          }
        }
      },
      {
        test: /\.css$/,
        use:[
          'style-loader',
          'css-loader',
          'postcss-loader' 
        ]
      },
      {
        test: /\.scss$/,
        use:[
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2,
              modules: true 
            }
          },
          'sass-loader',
          'postcss-loader'
        ]
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './index.html'
    }),
    new cleanWebpackPlugin(),
  ]
}

修改 package.json 的 script :

{
  "scripts": {
    "dev": "webpack-dev-server --config ./build/webpack.dev.js",
    "build": "webpack --config ./build/webpack.prod.js"
  },
}

开发环境:运行 npm run dev ,打开浏览器访问 http://localhost:8080/ 就可以看到结果

生产环境:运行 npm run build

配置文件拆分代码下载连接: github(demo5)


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

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Objective-C编程

Objective-C编程

[美] Aaron Hillegass / 夏伟频、李骏 / 华中科技大学出版社 / 2012-9-25 / 58.00元

《Objective-C编程》讲述Objective-C编程语言和基本的iOS/Mac开发知识。作者首先从基本的编程概念讲起(变量、条件语句、循环结构等),接着用浅显易懂的语言讲解Objective-C和Foundation的知识,包括Objective-C的基本语法、 Foundation常用类 、内存管理、常用设计模式等,最后手把手教读者编写完整的、基于事件驱动的iOS/Mac应用。作者还穿插......一起来看看 《Objective-C编程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具