我们平时开发的业务代码中包含着大量的npm包,这些npm包的存在给我们带来极大的便利,比如我们直接安装Vue/React脚手架的npm。就可以帮我们快速搭建一个项目的基本结构和必要配置。使我们更加关注到业务本身。
基于此我们如何将业务代码中重复可提取可单独维护的部分(函数、业务组件……)封装成一个npm包呢?
一、初始化项目
1、mkdir project_name_components 2、cd project_name_components 3、npm init -y |
---|
二、写入内容
- 新建index.js作为入口文件,主要完成公共代码的导入导出功能
mkdir src cd src touch index.js |
---|
- 新建component来写入公共函数或者组件,主要用来写入相关公共代码并导出 | cd src mrdir component cd component mkdir component1/indx.js …… | | —- |
三、打包配置
touch webpack.config.js npm i webpack webpack-cli babel @babel-core @@babel/preset-env babel-loader clean-webpack-plugin |
---|
webpack.config.js配置如下:
‘use strict’; const path = require(‘path’); const glob = require(‘glob’); const { CleanWebpackPlugin } = require(‘clean-webpack-plugin’); const getEntries = () => { const entry = {}; const entryFiles = glob.sync(path.join(dirname, ‘./src/component//index.js’)); Object.keys(entryFiles) .map((index) => { const entryFile = entryFiles[index]; const match = entryFile.match(/src\/component\/(.)\/index\.js/); const pageName = match && match[1]; entry[pageName] = entryFile; }); console.log(entry); return entry; } const entryObj = getEntries(); module.exports = { entry: Object.assign(entryObj, { index: ‘./src/index.js’}), output: { path: path.join(dirname, ‘lib’), filename: ‘[name]_[chunkhash:8].js’ }, mode: ‘production’, module: { rules: [ { test: /.js$/, use: [ ‘babel-loader’ ] } ] }, plugins: [ new CleanWebpackPlugin() ] } |
---|
执行打包结果如下:
为何采用这种多入口的打包方式??
每个组件单独打包+一个总包的方式主要是考虑到一个痛点:这个npm包的大小是否是业务中的痛点,如果这个npm包过大则需要考虑按需加载, 这种多入口的方式便于在业务代码中进行按需加载,如果包很小,则不需要直接打一个总包即可。
修改package.json中的入口文件地址:
四、发布
像这种对业务代码封装写成的npm包一般都是发布到自己公司的镜像上,不会发布到npm官网上。但是不管哪种方式都需要账号密码登录之后执行npm publish.
注意点
每次发包的版本需要遵循semver语义化版本规范,每次npm的升级根据升级情况修改版本号之后再npm publish。但是如果本次发包设计核心功能或者比较大的feature改动时,最好先发布先行版本,如下:
- alpha: 内部版本
- beta: 公测版本
- rc: 正式版本的候选版本
版本号格式如下:
主版本号[MAJOR].次版本号[MINOR].修订号[PATCH],版本号递增规则如下:
- 主版本号:当做了不兼容的 API 修改,
- 次版本号:当做了向下兼容的功能性新增,
- 修订号:当做了向下兼容的问题修正。
如果不知道如何修改可以直接使用指令:
npm i project_name_components -S import { Componnet1, Component2 } from ‘project_name_components’; 测试这个组件是否能正常工作。 |
---|
如果需要考虑按需加载,则需要在业务代码中安装npm i babel-plugin-component -D 插件并在.babelrc添加以下配置:
{ plugins: [ [ ‘component’, { ‘library’: ‘project_name_components’, } ] ] } |
---|
测试按需加载可以吧project_name_components单独打包出来进行包体积大小的对比 。
六、总结
本文从一个简单的例子介绍了如何基于业务封装适合业务的npm包。希望对大家有帮助~
七、参考链接
https://zhuanlan.zhihu.com/p/66198702
https://www.npmjs.com/package/semver
https://zhuanlan.zhihu.com/p/80754775