通过webpack创建并打包js库到npm仓库

1.创建项目并进行基本配置

webpack配置文件: webpack.build.js

const path = require('path');module.exports = {mode:'development',entry:'./src/webpack-numbers.js',output: {filename: 'webpack-numbers.js',path: path.resolve(__dirname, 'dist'),clean: true,},};

package.json:

script:{"buildJs": "webpack --config ./webpack.build.js",
"dev": "set NODE_ENV=development && webpack serve --open --config ./webpack.dev.js --mode=development",
}

2.暴露库:需要通过 output.library 配置项暴露从入口导出的内容

注意:如果是暴露为ES Module时,不用同时设置name属性,build时会报错

    //   暴露库library: {//   library.type设置为module时不能设置同时设置nametype: 'module',},},

3.使用库

可以通过 script 标签使用,不演示

4.运行在 ES6、CommonJS、AMD、Node.js 等环境中

以上都只能通过script 标签使用,但是希望它能够兼容不同的环境

解决:更新 output.library 配置项,将其 type 设置为 'umd':

output: {path: path.resolve(__dirname, 'dist'),filename: 'webpack-numbers.js',library: {name: 'webpackNumbers',type: 'umd',},},

我这里是将其导出为ES Module:

注意:

暴露为ES Module时,不能同时设置name属性;

且需要在output同级设置experiments.outputModule为true

    mode:'development',entry:'./src/webpack-numbers.js',output: {filename: 'webpack-numbers.js',path: path.resolve(__dirname, 'dist'),clean: true,//   暴露库library: {//   library.type设置为module时不能设置同时设置nametype: 'module',},},// 设置 type: 'module'时,必须加入以下配置experiments: { outputModule: true,},

 

5.library的type字段详解

library 可接受的数据类型是 string | string[] | object。string 是 object 类型的简写形式,当值为 object 类型时,object 中能包含的属性有 name、type、export、auxiliaryComment 和 umdNamedDefine。本文将重点放在 type 字段上,它决定如何公开当前库,取值基本固定,name 字段可以是任何字符串,它用来指定库的名称。

  1.  library.type = var(默认值),{type: 'var', name: 'MyLibrary'}:通过MyLibrary能访问到add函数,但不能保证MyLibrary在全局变量上
  2.  library.type = window ,{type: 'window', name: 'MyLibrary'}:通过window.MyLibrary能访问到add函数。
  3. library.type = module,将 library 的值改成 {type: 'module'}, 此时还要 experiments.outputModule 设置为 true。此时不存在闭包,并且能用 es modules 将库导入。
  4. library.type = this,将 library 的值改成 {type: 'this', name: 'MyLibrary'},通过 this.MyLibrary 能访问到 add 函数;
  5. 将 library 的值改成 {type: 'self', name: 'MyLibrary'},此时通过 self.MyLibrary 可访问到 add 函数,在浏览器环境的全局上下文中 self 等于 window;
  6. 将 library 的值改成 {type: 'global', name: 'MyLibrary'},此时 MyLibrary 会被分配到全局对象,全局对象会根据target值的不同而不同,全部对象可能的值是 self、global 或 globalThis。当 target 的值为 web(默认值),此时的打包结果与 library.type = self 结果一样。
  7. library.type = commonjs,将 library 的值改成 {type: 'commonjs', name: 'MyLibrary'}
  8. 将 library 的值改成 {type: 'commonjs2', name: 'MyLibrary'},CommonJs 规范只定义了 exports ,但是 module.exports 被 node.js 和一些其他实现 CommonJs 规范的模块系统所使用,commonjs 表示纯 CommonJs,commonjs2 在 CommonJs 的基础上增加了 module.exports。
     

webpack output.library的16 种取值方法示例_output.library.type-CSDN博客

7.使用命令npm run buildJs打包时报错

[webpack-cli] Error: Library name must be unset. Common configuration options that specific library names are 'output.library[.name]', 'entry.xyz.library[.name]', 'ModuleFederationPlugin.name' and 'ModuleFederationPlugin.library[.name]'.   

[webpack-cli] Error: Library name must be unset. Common configuration options that specific library names are 'output.library[.name]', 'entry.xyz.library[.name]', 'ModuleFederationPlugin.name' and 'ModuleFederationPlugin.library[.name]'.   

解决:library.type设置为module时不能设置同时设置name

    //   暴露库library: {//   library.type设置为module时不能设置同时设置name//name:'tools',type: 'module',},

6.外部化 lodash

如果工具包中将lodash也打包进去包体积会很大,所以可以通过设置externals属性将lodash包进行隔离不打包,但是这要求使用工具包的项目环境下安装了lodash这个被隔离的包。

externals: {lodash: {commonjs: 'lodash',commonjs2: 'lodash',amd: 'lodash',root: '_',},},

7.问题:导出为ES6报错: 

ERROR in external {"commonjs":"lodash","commonjs2":"lodash","amd":"lodash","root":"_"}
Cannot read properties of undefined (reading 'length')
TypeError: Cannot read properties of undefined (reading 'length')

解决:配置ES6的外置依赖库 module: 'lodash'

    // 依赖工具库外置:要求引用的项目本身有这个工具库externals: {lodash: {commonjs: 'lodash',commonjs2: 'lodash',amd: 'lodash',//    配置ES module module: 'lodash',root: '_',},

8.问题二:webpack 外部化lodash后报错,reduce()方法找不到

 将lodash外部化后,工具类中的引入lodash就不能再使用了,否则就会报错。注释掉引用即可用

// 注意外部化的时候,这里引入就不能直接引入了
// import _ from 'lodash';
import numRef from './data/ref.json';export function numToWord(num) {return _.reduce(numRef,(accum, ref) => {return ref.num === num ? ref.word : accum;},'');
}export function wordToNum(word) {return _.reduce(numRef,(accum, ref) => {return ref.word === word && word.toLowerCase() ? ref.num : accum;},-1);
}

9.外部化的限制

对于想要实现从一个依赖中调用多个文件的那些库,无法通过在 externals 中指定整个 library 的方式将它们从 bundle 中排除,而是需要逐个或者使用正则表达式排除它们。

module.exports = {//...externals: ['library/one','library/two',// 匹配以 "library/" 开始的所有依赖/^library\/.+$/,],
};

10.优化生产环境下的输出结果

为了优化生产环境下的输出结果。那么,我们还需要将生成 bundle 的文件路径,添加到 package.json 中的 main 字段中。

{..."main": "dist/webpack-numbers.js",...
}

或者,按照这个 指南 将其添加为标准模块

{..."module": "src/webpack-numbers.js",...
}

另外,为了暴露和库关联的样式表,你应该使用 MiniCssExtractPlugin。然后,用户可以像使用其他样式表一样使用和加载这些样式表。

11.发布到npm仓库

可以 将其发布为一个 npm 包,并且在 unpkg.com 找到它,并分发给你的用户。

进入打包好后的文件夹dist,然后npm init 创建package.json文件,并且设置基本信息

{"name": "webpack-numbers-lmf","version": "1.0.4","description": "修改","main": "webpack-numbers.js","private": false,"scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "limingfang","license": "ISC"
}

npm login登录npm仓库

命令行输入用户名和密码后npm publish发布版本即可

12.使用:

npm i webpack-numbers-lmf lodash -S
import { numToWord,wordToNum } from "webpack-numbers-lmf"
console.log(numToWord(3), wordToNum("Ten") );

13.完整配置代码

webpack.build.js:

//webpack.build.js
const path = require('path');module.exports = {mode:'development',entry:'./src/webpack-numbers.js',output: {filename: 'webpack-numbers.js',path: path.resolve(__dirname, 'dist'),clean: true,//   暴露库library: {//   library.type设置为module时不能设置同时设置nametype: 'module',},},// 设置 type: 'module'时,必须加入以下配置experiments: { outputModule: true,},// 依赖工具库外置:要求引用的项目本身有这个工具库externals: {lodash: {commonjs: 'lodash',commonjs2: 'lodash',amd: 'lodash',//    配置ES module module: 'lodash',root: '_',},},};
//package.json
{"name": "webpack-demo","version": "1.0.0","description": "","private": false,"main": "dist/webpack-numbers.js","module": "src/webpack-numbers.js","scripts": {"buildJs": "webpack --config ./webpack.build.js","dev": "set NODE_ENV=development && webpack serve --open --config ./webpack.dev.js --mode=development","prod": "set NODE_ENV=production && webpack serve --open --config ./webpack.prod.js --mode=production"},
...
}
//webpack-numbers.js
// 注意外部化的时候,这里引入就不能直接引入了
// import _ from 'lodash';
import numRef from './data/ref.json';export function numToWord(num) {return _.reduce(numRef,(accum, ref) => {return ref.num === num ? ref.word : accum;},'');
}export function wordToNum(word) {return _.reduce(numRef,(accum, ref) => {return ref.word === word && word.toLowerCase() ? ref.num : accum;},-1);
}

dist里的package.json

{"name": "webpack-numbers-lmf","version": "1.0.4","description": "修改","main": "webpack-numbers.js","private": false,"scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "xxx","license": "ISC"
}

 使用:

//index.js
import _ from 'lodash';
import { numToWord,wordToNum } from "webpack-numbers-lmf"function component() {console.log(numToWord(3), wordToNum("Ten") );return element;
}document.body.appendChild(component());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker搭建kafka集群、可视化操作台

单机搭建 1 拉取zookeeper镜像 docker pull wurstmeister/zookeeper 2 启动zookeeper容器 docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper 3 拉取kafka镜像 docker pull wurstmeister/kafka 4 启动kafka镜像 docker…

【玩机】如何修改iPhone充电提示音!最详细简单保姆级教程~ 学费了可替换任意音频做你的专属充电提示音!——后厂村路灯

其实方法很简单,利用快捷指令,获得base64 位的音频文本,然后再充电时播放即可。 视频教程 【玩机】如何修改iPhone充电提示音!最详细简单保姆级教程 具体操作如下: 1.首先,网上找到需要设定的音频&#xf…

一个单身狗 和 两个单身狗

一个单身狗 一个数组中只有一个数字是出现一次&#xff0c;其他所有数字都出现了两次。 编写一个程序找出这个只出现一次的数字。 方法1(异或) a ^ a 0a ^ 0 a^满足结合律 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,4,2,3,5};int i 0;int ret 0;in…

Linux grep 命令参数使用方法[-vE]

Linux grep 命令参数使用方法[-vE] grep 常用参数常用的g r e p选项使用grep匹配“与”或者“或”模式 grep 常用参数 参数 -v #排除条件-E #多个条件使用&#xff0c;或例子&#xff1a;排除#号和空格行内容 #grep命令去掉空格行和以#开头的行 grep -vE ^#|^$ filename“…

Flutter笔记:电商中文货币显示插件Money Display

Flutter笔记 电商中文货币显示插件 Money Display 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1338…

Pulsar 之架构,客户端以及多区域容灾

Pulsar 之架构&#xff0c;客户端以及多区域容灾 架构BrokersClusters元数据存储配置存储区持久存储Apache BookKeeperLedgersLedgers读一致性托管Ledgers 日志存储 Pulsar 代理服务发现 Pulsar client(客户端)客户端设置阶段Reader interface 多区域容灾备份(GEO-REPLICATION)…

Apacheb Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

Apache Shiro 1.2.4反序列化漏洞&#xff08;CVE-2016-4437&#xff09; 1 在线漏洞解读: https://vulhub.org/#/environments/shiro/CVE-2016-4437/2 环境搭建 cd /home/kali/vulhub/shiro/CVE-2016-4437启动&#xff1a; sudo docker-compose up -d # 拉取下载并启动sud…

AtCoder ABC324G 启发式合并

题意 传送门 AtCoder ABC324G Generate Arrays 题解 逆则操作顺序考虑&#xff0c;可以看作至多 n n n 个联通分量不断合并的过程&#xff0c;此时使用启发式合并&#xff0c;即规模较小的连通分量向规模较大的连通分量合并&#xff0c;以单个元素合并为基本运算&#xff0…

Knife4j Spring Boot:在线API文档

1.导入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>${knife4j-spring-boot.version}</version></dependency>2.再配置文件中打开日志 knife4j.en…

C# 解决从其他地方迁移项目,引用中大多数包是感叹号的问题

当在 Visual Studio 中复制别人的 C# 项目时&#xff0c;遇到许多包冒感叹号的问题通常是因为缺少相关的 NuGet 包或引用不正确导致的。这会在解决方案资源管理器中的引用下显示感叹号。 解决办法如下&#xff1a; 在 Visual Studio 中打开项目。 在解决方案资源管理器中&…

【更新】囚生CYの备忘录(202331014~)

文章目录 20221014 20221014 本以为下午怡宝的比赛至少是能跑到前三&#xff0c;结果连前五都没混到&#xff0c;赛前都知道路线不可能有5km&#xff0c;因为即便是绕着主校区最外沿跑一圈也才4km出头&#xff0c;我估摸着大概是2500米&#xff0c;结果实际上只有1700米&#x…

服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

Unity基础课程之物理引擎3-碰撞检测案例-吃金币并加分显在UI文本框上

业务逻辑&#x1f4bc;&#xff1a; 这个脚本的主要功能是用于显示和更新主角的得分。在游戏中&#xff0c;玩家需要吃到金币来增加分数&#xff0c;而这个脚本就是负责将得分的变化实时显示在屏幕上的。 程序逻辑&#x1f4bb;&#xff1a; 1️⃣首先&#xff0c;在脚本的开始…

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …

NginxWebUI runCmd 远程命令执行漏洞复现 [附POC]

文章目录 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相…

git log

git log -p 是一个用于显示git commit历史的命令&#xff0c;它会展示每个commit的详细信息&#xff0c;包括每个修改文件的清单、添加/删除的行所在的位置以及具体的实际更改。这个命令能够让用户深入了解仓库的历史记录。 与git log相比&#xff0c;git log -p 提供了更多的…

Android 13.0 添加自定义服务,并生成jar给第三方app调用

1.概述 在13.0系统产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 2. …

【机器学习】sklearn对数据预处理

文章目录 数据处理步骤观察数据数据无量纲化缺失值处理处理分类型特征处理连续型特征 数据处理步骤 数据无量纲化缺失值处理处理分类型特征&#xff1a;编码与哑变量处理连续型特征&#xff1a;二值化与分段 观察数据 通过pandas读取数据&#xff0c;通过head和info方法大致查…

【算法|动态规划No.18】leetcode718. 最长重复子数组

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

crontab报错/var/spool/cron : Permission denied和 -bash: chattr: command not found

crontab报错/var/spool/cron : Permission denied和 -bash: chattr: command not found 1、第一种情况2、第二种情况3、第三种情况 1、第一种情况 centos7下修改定时任务crontab -e的时候&#xff0c;控制台输出“crontab: installing new crontab”&#xff0c;表示任务添加成…