发布一个npm组件库包

Webpack 配置 (webpack.config.js)

js 复制代码
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  entry: './src/index.js', // 入口文件
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-library.js', // 输出文件
    library: 'MyLibrary', // 库名称
    libraryTarget: 'umd', // 支持多种模块化格式
    globalObject: 'this', // 解决 UMD 在浏览器和 Node.js 环境下的兼容性问题
  },
  externals: {
    react: 'react', // 不打包 React,使用外部的 React
    'react-dom': 'react-dom', // 不打包 ReactDOM
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react'],
          },
        },
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        type: 'asset/resource',
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        type: 'asset/resource',
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'my-library.css',
    }),
  ],
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin(), // 压缩 JavaScript
      new CssMinimizerPlugin(), // 压缩 CSS
    ],
  },
  resolve: {
    extensions: ['.js', '.jsx'], // 解析这些扩展名的文件
  },
};
  • 外部依赖:在 externals 中配置不打包的依赖(例如 React 和 ReactDOM),并在 peerDependencies 中声明它们,以确保用户在使用你的库时会安装这些依赖。

Package.json 配置

js 复制代码
{
  "name": "my-library",
  "version": "1.0.0",
  "main": "dist/my-library.js", // CommonJS 入口
  "module": "dist/my-library.esm.js", // ESModule 入口
  "files": [
    "dist"
  ],
  "scripts": {
    "build": "webpack --mode production"
  },
  "dependencies": {
    // 需要打包的依赖
  },
  "peerDependencies": {
    "react": "^17.0.0", // 作为 peer dependency
    "react-dom": "^17.0.0"
  },
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "@babel/preset-react": "^7.0.0",
    "babel-loader": "^8.0.0",
    "css-loader": "^6.0.0",
    "mini-css-extract-plugin": "^2.0.0",
    "terser-webpack-plugin": "^5.0.0",
    "css-minimizer-webpack-plugin": "^3.0.0",
    "webpack": "^5.0.0",
    "webpack-cli": "^4.0.0"
  }
}
  • main:
相关推荐
小满zs2 分钟前
Next.js第十九章(服务器函数)
前端·next.js
仰望.8 分钟前
vxe-table 如何实现分页勾选复选框功能,分页后还能支持多选的选中状态
前端·vue.js·vxe-table
铅笔侠_小龙虾15 分钟前
html+css 实现键盘
前端·css·html
licongmingli22 分钟前
vue2 基于虚拟dom的下拉选择框,保证大数据不卡顿,仿antd功能和样式
大数据·前端·javascript·vue.js·anti-design-vue
小笔学长26 分钟前
Webpack 入门:打包工具的基本使用
前端·webpack·前端开发·入门教程·前端打包优化
黎明初时28 分钟前
react基础框架搭建4-tailwindcss配置:react+router+redux+axios+Tailwind+webpack
前端·react.js·webpack·前端框架
小沐°28 分钟前
vue3-父子组件通信
前端·javascript·vue.js
铅笔侠_小龙虾29 分钟前
Ubuntu 搭建前端环境&Vue实战
linux·前端·ubuntu·vue
yuhaiqun198931 分钟前
发现前端性能瓶颈的巧妙方法:建立“现象归因→分析定位→优化验证”的闭环思维
前端·经验分享·笔记·python·学习·课程设计·学习方法
树叶会结冰40 分钟前
TypeScript---循环:要学会原地踏步,更要学会跳出舒适圈
前端·javascript·typescript