【问题标题】:Include assets from webpack bundled npm package包含来自 webpack 捆绑的 npm 包的资产
【发布时间】:2016-08-02 06:34:03
【问题描述】:

我一直在努力解决这个问题,并且想知道是否可以开始。感谢您对此的任何帮助!

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。

console errs

有没有办法告诉 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'
      }
    ]
  }
};

【问题讨论】:

  • 如果图片没有被导入或者不需要,webpack 不会处理它们。你可能想要copy-webpack-plugin
  • 感谢@Interrobang。我对采用这种方法有点不确定,因为 npm 包中的 webpack 构建步骤似乎需要了解我的应用程序的公共路径。我的应用程序的 webpack 配置中是否有任何选项可以在我复制资产后再次解析路径?
  • 知道了,将发布修复程序。谢谢@Interrobang!

标签: javascript reactjs npm webpack assets


【解决方案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'))

【讨论】:

  • 但是,如果您正在创建一个 NPM 模块,有人可能会拉入到任意 Web 应用程序中,这会起作用吗?假设最终他们的 Web 应用程序是从 theirserver.com/subfolder 而不是从服务器的根目录提供服务,那么 webpack 将如何解析到正确的绝对路径?
猜你喜欢
  • 2022-07-28
  • 1970-01-01
  • 2018-07-12
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多