发布一个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:
相关推荐
bsr198311 分钟前
前端路由的hash模式和history模式
前端·history·hash·路由模式
杨过姑父37 分钟前
ES6 简单练习笔记--变量申明
前端·笔记·es6
真想骂*1 小时前
Node.js日志记录新篇章:morgan中间件的使用与优势
中间件·node.js
Sunny_lxm1 小时前
<keep-alive> <component ></component> </keep-alive>缓存的组件实现组件,实现组件切换时每次都执行指定方法
前端·缓存·component·active
咔咔库奇2 小时前
【TypeScript】命名空间、模块、声明文件
前端·javascript·typescript
兩尛2 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
又迷茫了2 小时前
vue + element-ui 组件样式缺失导致没有效果
前端·javascript·vue.js
哇哦Q3 小时前
原生HTML集合
前端·javascript·html
SoWhat~3 小时前
随遇随记篇
前端·javascript
孟健3 小时前
重磅首发:国产AI编程助手Trae实测!免费用上Claude是什么体验?
前端·aigc·visual studio code