包含来自 webpack 捆绑的 npm 包的资产

IT技术 javascript reactjs npm webpack assets
2021-04-21 19:59:09

我已经为此纠结了一段时间,我想知道是否有可能开始。感谢您对此的任何帮助!

npm 包

我有一个 npm 包,它基本上是一个 React 组件库。这个库有嵌入的样式表,它引用来自 CSS 的字体和图像等资产。然后这些都使用 webpack 捆绑到my-package.js.

这个配置看起来像:

var path = require('path');

module.exports = {
  module: {
    loaders: [
      {
        test: /\.js$/,
        loaders: ['babel-loader'],
        exclude: /node_modules/
      },
      {
        test: /\.css$/,
        loader: "style-loader!css-loader"
      },
      {
        test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,
        loader: 'file-loader'
      },
      {
        test: /\.styl$/,
        loader: 'style-loader!css-loader!stylus-loader'
      }
    ]
  },
  entry: [
    './lib/components/index.js',
    './lib/index.styl'
  ],
  output: {
    path: path.join(__dirname, 'build/'),
    filename: 'my-package.js'
  }
}

随着./lib/components/index.js看起来像:

import '../index.styl';
import MyComponent from './my-component.js';

export {
  MyComponent
}

到现在为止还挺好。

应用程序

现在在另一个代码库中,我有主应用程序,它安装了这个 npm 包。

我的应用程序根目录需要这个包...

import MyPackage from 'my-package';

然后将 webpack 本身打包并加载到浏览器中。所有脚本和样式块都正确捆绑,但是引用资产的样式使用的是来自 npm 包本身的相对 url,因此从应用程序中给了我 404。

控制台错误

有没有办法告诉 webpack 解析这些图像node_modules/my-package/build/[webpack-generated-name].jpg

我的应用程序的 webpack 配置如下所示:

var path = require('path'),
    webpack = require('webpack');

module.exports = {
  devtool: '#eval-source-map',
  entry: [
    'my-package',
    'webpack/hot/only-dev-server',
    './app/index.js',
  ],
  output: {
    path: path.join(__dirname, 'build/static'),
    filename: 'bundled.js',
    publicPath: '/',
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ],
  resolve: {
    extensions: ['', '.js']
  },
  resolveLoader: {
    'fallback': path.join(__dirname, 'node_modules')
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        loaders: ['react-hot', 'babel'],
        exclude: /node_modules/,
        include: __dirname
      },
      {
        test: /\.css?$/,
        loader: "style-loader!css-loader",
        include: __dirname
      },
      {
        test: /\.(jpg|jpeg|ttf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/,
        loader: 'file-loader'
      },
      {
        test: /\.styl$/,
        loader: 'style-loader!css-loader!stylus-loader'
      }
    ]
  }
};
1个回答

想了个办法解决这个问题。

在我的应用程序的 webpack 配置中,我添加了一个插件(由@Interrobang 推荐),它将静态资产从 复制node_module/my-package到应用程序服务器的公共路径中:

var TransferWebpackPlugin = require('transfer-webpack-plugin');

...
plugins: [
  new TransferWebpackPlugin([
    { from: 'node_modules/my-package/assets', to: path.join(__dirname, 'my/public') }
  ])
]
...

然后可以通过调用资产名称来访问这些:localhost:XXXX/my-image.jpg这里的服务器基本上是在查看/my/public/my-image.jpg您是否正确设置了它。

我正在使用 Express,所以我只需要app.use(express.static('my/public'))在我的应用服务器中定义

但是,如果您正在创建一个有人可能会将其引入任意 Web 应用程序的 NPM module,这会起作用吗?假设最终他们的 Web 应用程序是从theirserver.com/subfolder而不是从服务器的根目录提供的,webpack 将如何解析为正确的绝对路径?
2021-06-07 19:59:09