webpack进阶篇(二十五):webpack打包组件和基础库

Posted 凯小默的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack进阶篇(二十五):webpack打包组件和基础库相关的知识,希望对你有一定的参考价值。


webpack 打包库和组件

webpack 除了可以⽤来打包应⽤,也可以⽤来打包 js 库。

接下来我们实现⼀个⼤整数加法库的打包

  • 需要打包压缩版和⾮压缩版本
  • ⽀持 AMD/CJS/ESM 模块引⼊

库的录结构和打包要求

打包输出的库名称:

  • 未压缩版 large-number.js
  • 压缩版 large-number.min.js
+ |- /dist
+ |- large-number.js
+ |- large-number.min.js
+ |- webpack.config.js
+ |- package.json
+ |- index.js
+ |- /src
+ |- index.js

支持的使用方式

1、⽀持 ES module

import * as largeNumber from large-number;
// ...
largeNumber.add(999, 1);

2、⽀持 CJS

const largeNumbers = require(large-number);
// ...
largeNumber.add(999, 1);

3、⽀持 AMD

require([large-number], function (large-number) 
// ...
largeNumber.add(999, 1);
);

4、可以直接通过 script 引⼊

<!doctype html>
<html>
...
<script src="https://unpkg.com/large-number"></script>
<script>// ...
// Global variable
largeNumber.add(999, 1);
// Property in the window object
window.largeNumber.add(999, 1);
// ...</script>
</html>

如何将库暴露出去?

​library​​: 指定库的全局变量

​libraryTarget​​: ⽀持库引⼊的⽅式

module.exports = 
mode: "production",
entry:
"large-number": "./src/index.js",
"large-number.min": "./src/index.js"
,
output:
filename: "[name].js",
library: "largeNumber",
libraryExport: "default",
libraryTarget: "umd"

;

如何指对 .min 压缩

通过 include 设置只压缩 min.js 结尾的⽂件

module.exports = 
mode: "none",
entry:
"large-number": "./src/index.js",
"large-number.min": "./src/index.js"
,
output:
filename: "[name].js",
library: "largeNumber",
libraryTarget: "umd"
,
optimization:
minimize: true,
minimizer: [
new TerserPlugin(
include: /\\.min\\.js$/,
),
],

;

设置入口文件

package.json 的 main 字段为 index.js,根目录新增index.js文件

if (process.env.NODE_ENV === "production") 
module.exports = require("./dist/large-number.min.js");
else
module.exports = require("./dist/large-number.js");

实战开发

1、初始化项目

​mkdir large-number​

​cd large-number​

​npm init -y​

​npm i webpack webpack-cli -D​

2、创建​​src/index.js​​,在里面实现大整数加法功能

export default function add(a, b) 
let i = a.length - 1;
let j = b.length - 1;

let carry = 0;
let ret = ;
while (i >= 0 || j >= 0)
let x = 0;
let y = 0;
let sum;

if (i >= 0)
x = a[i] - 0;
i --;


if (j >= 0)
y = b[j] - 0;
j --;


sum = x + y + carry;

if (sum >= 10)
carry = 1;
sum -= 10;
else
carry = 0;

// 0 +
ret = sum + ret;


if (carry)
ret = carry + ret;


return ret;


// add(999, 1);
// add(1, 999);
// add(123, 321);
// console.log(add(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 1));

3、创建​​webpack.config.js​

需要安装插件:​​npm i terser-webpack-plugin -D​

“terser-webpack-plugin”: “^1.3.0”,4.0会报错

const TerserPlugin = require(terser-webpack-plugin);

module.exports =
entry:
large-number: ./src/index.js,
large-number.min: ./src/index.js
,
output:
filename: [name].js,
library: largeNumber,
libraryTarget: umd,
libraryExport: default
,
mode: none,
optimization:
minimize: true,
minimizer: [
new TerserPlugin(
include: /\\.min\\.js$/,
),
],

打包的效果就实现了压缩

webpack进阶篇(二十五):webpack打包组件和基础库_压缩版

4、设置入口文件

根目录新增index.js文件

if (process.env.NODE_ENV === "production") 
module.exports = require("./dist/large-number.min.js");
else
module.exports = require("./dist/large-number.js");

package.json的配置,里面添加了​​prepublish​​的处理


"name": "large-number",
"version": "1.0.0",
"description": "大整数加法打包",
"main": "index.js",
"scripts":
"test": "echo \\"Error: no test specified\\" && exit 1",
"build": "webpack",
"prepublish": "webpack"
,
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies":
"terser-webpack-plugin": "^1.3.0",
"webpack": "^4.44.1",
"webpack-cli": "^3.3.12"

5、发布npm包,包名需要更改,我这边用了​​kaimo-large-number​

具体可以参考我的另一篇笔记

怎么将自己的写的库发布到npm上面?

6、使用自己的npm包

首先在我们的业务安装​​npm i kaimo-large-number -S​

webpack进阶篇(二十五):webpack打包组件和基础库_webpack_02

然后在业务代码里面使用’kaimo-large-number’

import React from react;
import ReactDOM from react-dom;
import ./search.less;
import logo from ./images/logo.png;
console.log(logo);
import ../../common/index.js;
import kaimo666 from ./tree-shaking.js;
// 引入大加法
import kaimoLargeNumber from kaimo-large-number;


class Search extends React.Component

constructor()
super(...arguments);

this.state =
Text: null



loadComponent()
// 动态加在text.js,返回一个promise
import(./text.js).then((Text) =>
console.log(Text);
this.setState(
Text: Text.default
);
)


render()
const kaimo = kaimo666();
const Text = this.state;
const kaimoLarge = kaimoLargeNumber(777, 666);
return <div className="search-text">
kaimo
凯小默的博客666
Text ? <Text /> : null
大加法操作777+666: kaimoLarge
<img src= logo onClick= this.loadComponent.bind(this) />
</div>



ReactDOM.render(
<Search/>,
document.getElementById(root)
)

页面效果:

webpack进阶篇(二十五):webpack打包组件和基础库_html_03

如果你​​npm run build​​的出现下面问题:说明你发布的包有问题没有把dist目录包含进来,去除你git忽略文件里的dist,你需要更新你的包

webpack进阶篇(二十五):webpack打包组件和基础库_压缩版_04

找到自己库的​​.gitignore​​文件,去掉dist

webpack进阶篇(二十五):webpack打包组件和基础库_html_05


以上是关于webpack进阶篇(二十五):webpack打包组件和基础库的主要内容,如果未能解决你的问题,请参考以下文章

Webpack入门教程二十五

webpack原理篇(五十五):webpack流程:准备阶段

Vue 教程(三十五)webpack 之 HTML 插件

Vue 教程(三十五)webpack 之 HTML 插件

webpack优化篇(四十五):进一步分包:预编译资源模块

前端打包工具进阶webpack到parcel