发布一个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:
相关推荐
kyriewen16 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒17 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
DigitalOcean19 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年19 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟19 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu1119 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue19 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区19 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两19 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒19 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript