webpack试练03

295 阅读2分钟

1、tree shaking

  • 提到tree shaking就要说到mode
  • 当mode为develoment|none时,未使用到的模块也会被被打包进来
  • 当mode为production时,未使用到的模块则不会被打包进了
  • 当然希望打包进来的也是有方法的
在package.json文件中添加副作用列表,列表内的不管用没用到,都会打包进来
"sideEffects": [
  "**/*.css",
  "**/*.scss",
  "./esnext/index.js",
  "./esnext/configure.js"
],

2、Scope Hoisting

  • 未开启时存在的问题:打包后的代码存在大量的闭包代码,导致体积增大,作用域变多,内存开销大
  • 开启后:会被webpack加上一层包裹 import会被编译成__webpack_require,打包出IIFE(匿名闭包)
  • 原理:将所有模块的代码按顺序放在一个函数的作用域里,然后适当的重命名一些变量以防止变量名冲突,以此来减少函数的声明和内存的开销
  • 当mode为develoment|none时
// 可以手动开启
new webpack.optimize.ModuleConcatenationPlugin(),
  • 当mode为production时,默认开启
  • 仅支持es6语法

3、代码分割及动态import

  • 动态引入import需babel插件的支持
{
  "presets": [["@babel/preset-env"], "@babel/preset-react"],
  "plugins": ["@babel/plugin-syntax-dynamic-import"]
}
import React from "react";
import ReactDOM from "react-dom";
import logo from "../../../images/loaders.png";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      Text: null,
    };
  }
  loadComponent = () => {
  // 在这里就可以动态引入了,这一个text组件也会单独被打包出来,当点击时则会动态加载
    import("./text.js").then((Text) => {
      this.setState({
        Text: Text.default,
      });
    });
  };

  render() {
    const { Text } = this.state;
    return (
      <div className="search">
        {Text ? <Text /> : "11"}
        <img onClick={this.loadComponent} src={logo} alt="" />
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));

4、在webpack中使用ESLint

  • 创建.eslintrc.js文件
module.exports = {
  // 所使用的及继承的lint包都需要安装 
  "parser": "babel-eslint",
  "extends": "airbnb",
  // "rules": {
  //     "semi": "error"
  // },
  "env": {
    "browser": true,
    "node": true
  }
}
  • webpack配置修改
 module: {
    rules: [
      {
        test: /.js$/,
        use: [
          "babel-loader",
          "eslint-loader"
        ],
      },
    ]
  }

5、webpack打包组件或基础库

说来惭愧,入行两年多了,竟然没注册过npm,自己连个简单的组件库都没有

  • 看代码吧
--webpack 配置
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
  entry: {
    "larger-number": "./src/index.js",
    "larger-number.min": "./src/index.js",
  },
  mode: 'none',
  output: {
    filename: "[name].js",
    // 打包库的名字
    library: "largeNumber",
    // 支持  amd cmd es6 script标签引入
    libraryTarget: "umd",
    libraryExport: "default",
  },
  optimization: {
    minimize: true,
    minimizer: [
      // mode: production 时默认使用的压缩插件,
      new TerserPlugin({
        include: /\.min\.js$/,
      }),
    ],
  },
};

--index 使用打包文件
if (process.env.NODE_ENV === "production") {
  module.exports = require("./dist/larger-number.min.js");
} else {
  module.exports = require("./dist/larger-number.js");
}

github地址:github.com/838216870/w…

不断学习中,有想沟通交流的欢迎评论留言;