最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现。

创建library

    output: {
path: DIST_PATH,
publicPath: "",
chunkFilename: "[name].js",
filename: "testPlugin.js",
libraryTarget: 'umd',//将你的 library 暴露为所有的模块定义下都可运行的方式
library: 'testPlugin'
},
  • 打包出来后我们会得到一个testPlugin.js,这就是我们自己的三方库。

平台项目中使用

  • 项目中设置externals,目的是使自己项目不会重复打包引入的库
    externals: {
testPlugin:"testPlugin",
},
  • 项目引入
<!--index.html-->
<script src="testPlugin.js"></script>
//index.js
import testPlugin from 'testPlugin';
console.log(testPlugin);
  • 项目打包好
  • 将testPlugin库丢入打包好的dist中
  • 会发现平台项目已经成功引入库
  • 这样会发现只有打包好dist再丢入库才可以看到效果,平时开发环境下怎么办呢,可以使用copy-webpack-plugin,及将静态的文件夹自动拷贝到dist
const copyWebpackPlugin = require('copy-webpack-plugin');

    plugins: [
new copyWebpackPlugin([{
from:__dirname+'/src/static',//打包的静态资源目录地址
to:'./static' //打包到dist下面的static
}]),
...
]
  • 然后只需要改改index.html的引入地址
<script src="static/plugin/testPlugin/testPlugin.js"></script>

发布npm包

上面的方法的优点是:如果兄弟部门的三方库变了,只需要他们把打包好的库文件给我们,我们丢进去替换掉以前的就可以了,我们自己并不需要重新打包。

那发布npm包呢?自己没事又摸索了一波,并成功发布了一个可以对文本插入表情的react小插件。

------传送门------

发布准备

  • 自己的项目
  • 去npm官网,注册账号。
  • 给自己的npm包想个名字,并通过搜索验证是否没有被占用

改写项目webpack配置

  • 核心,同上面的创建library一样
  • 生产环境配置webpack.config.prod.js
//webpack.config.prod.js
entry: {
component: ['./src/component/Expression/Expression.js']
},
output: {
path: DIST_PATH,
filename: '[name].js',
publicPath: "/dist/",
libraryTarget: 'umd',
library: 'expression'
},
externals: {
'react': 'react',//因为引入的肯定是react项目,所以不需要再将react打包进npm包
'react-dom': 'react-dom'
},
  • 开发环境配置webpack.config.dev.js
//webpack.config.dev.js
entry: {
app: ['./src/index.js'],
component: ['./src/component/Expression/Expression.js']
},
  • 这样设置之后打包出来只有一个component.js,所以需要修改package的main
  • 修改package.json
  "main": "dist/component.js",
  • package的其他设置

    • 另外package里面的name就是你包的名字
    • version是版本号
    • main是入口文件
    • description是描述
    • repository是线上git地址
    • keywords是关键字,比较重要,别人可以通过这个搜索到你的包
    • author是作者

做完这些就可以发布了

  • npm login

    • 会让你输入账号,密码,邮箱,然后就登陆了
  • 登录成功会出现以下提示信息:Logged in as simbawu on https://registry.npmjs.org/.
    • 注意:如果不是这个,而是我们的其他镜像比如淘宝的,需要先切换回来,否则提交不起npm config set registry https://registry.npmjs.org/,然后再次npm login。
  • npm publish发布
    • 若出现包名和版本号则发布成功

自己发布的react小插件

------传送门------

最后

大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……

个人博客:www.yangyuetao.cn

小程序:TaoLand

webpack创建library及从零开始发布一个npm包的更多相关文章

  1. 发布一个npm包(webpack loader)

    发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...

  2. 如何发布一个npm包(基于vue)

    前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...

  3. 从零开始写一个npm包及上传

    最近刚好自己需要写公有npm包及上传,虽然百度上资料都能找到,但是都是比较零零碎碎的,个人就来整理下,如何从零开始写一个npm包及上传. 该篇文件只记录一个大概的流程,一些细节没有记录. tips:  ...

  4. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  5. 如何发布一个 npm 包

    一 背景 在工作时,突然接到经理的一个要求,需要将一个react的高阶组件函数封装成一个npm包.之前从没弄过,当场还是有些懵逼的,但是这毕竟是工作,不能推脱.于是开始了学习.汤坑之旅.最终包发布,线 ...

  6. (转)前端开发-发布一个NPM包之最简单易懂流程

    原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...

  7. 从零开始写一个npm包,一键生成react组件(偷懒==提高效率)

    前言 最近写项目开发新模块的时候,每次写新模块的时候需要创建一个组件的时候(包含组件css,index.js,组件js),就只能会拷贝其他组件修改名称 ,但是写了1-2个后发现效率太低了,而且极容易出 ...

  8. 如何发布一个npm包?

    npm包在现在前端开发中经常使用且便利,而我也是经常使用,而没研究怎么去发布npm.那如何发布npm包呢? 一.在npm的官网上注册一个账号登录,https://www.npmjs.com/ 注意此步 ...

  9. 发布一个npm包

    前言 我这里是写了一个vue轮播图插件,因此我使用了vue的脚手架工具创建一个项目,当然你也可以选择自己搭建脚手架. 本例中我会使用vue脚手架创建一个项目,并发布到npm上面去. 通过脚手架创建项目 ...

随机推荐

  1. bzoj1081

    题解: 先暴力找规律 然后就一加一减的枚举 代码: #include<bits/stdc++.h> using namespace std; ],p[]; int main() { sca ...

  2. windows下运用批处理实现一键自动开启多个应用

    工作时,我每天早上到公司,打开自己的电脑,都会有几个固定的软件(myeclipse,飞信,firefox,foxmail等).文件夹和文件需要打开,每天如此,感到很烦,浪费时间做重复的工作,于是想到一 ...

  3. Python & PyCharm & Django 搭建web开发环境

    一.安装软件 1.安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 二.部署 1.PyCharm 新建Django ...

  4. 一些java的部署执行编译等命令

    编译: javac 参数 -d 指定编译后文件的位置 java 执行java文件 java生成jar文件 java执行jar文件 java生成war文件 war包是一种将web程序捆绑到单个文件上的一 ...

  5. Python中字典的基本操作

    字典(Dictionary)是一映射类型(Key-value):字典是可变的,可存储任意类型对象 字典的定义用大括号{ },每个值用 ”,“ 逗号隔开,key和value使用 ”:“ 冒号分隔 字典的 ...

  6. UNIX设备文件

    UNIX和Linux中比较重要的三个设备文件是:/dev/console,/dev/tty和/dev/null. 0 /dev/console 这个设备代表的是系统控制台,错误信息和诊断信息通常会被发 ...

  7. ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed

    1.  问题描述 最近使用ABP .Net Core框架做一个微信开发,同时采用了一个微信开发框架集成到ABP,在微信用户关注的推送事件里调用了一个async 方法,由于没有返回值,也没做任何处理,本 ...

  8. tmux安装与使用

    安装 用法 重点 一prefix前缀键 二window和pane的区分 tmux 按照官方给出的介绍是:终端复用工具.说白了就是可以仅仅在开启一个终端的情况下同时处理多个任务. 比如下面我设置的这样一 ...

  9. 强化学习 CartPole实验的一些启发 有没有可能设计一个新的实验呢?(杆子可以向360度方向倾倒,可行吗?)

    最近在看强化学习方面的东西,突然想到了这么一个事情,那就是经典的CartPole游戏我们改变一下,或者说升级一下,那么使用强化学习是否能得到不错的效果呢? 原始游戏如图: 一点个人的想法: ===== ...

  10. Flume-NG源码阅读之Interceptor(原创)

    有的时候希望通过Flume将读取的文件再细分存储,比如讲source的数据按照业务类型分开存储,具体一点比如类似:将source中web.wap.media等的内容分开存储:比如丢弃或修改一些数据.这 ...