【问题标题】:How to dynamically load an asset (pdf) in an angular app using webpack?如何使用 webpack 在 Angular 应用程序中动态加载资产(pdf)?
【发布时间】:2018-05-11 13:33:20
【问题描述】:

我正在尝试使用带有data 属性的HTML <object> 标记将pdf 加载到我在webpack dev server 上运行的角度应用程序中。

由于 pdf 路径是在运行时生成的,并且是 absoluteC:\test.pdf

它没有加载到 UI 中,而是 console 记录错误 -

Not allowed to load local resource: file:///C:/test.jpeg

但是,不能在托管服务器上运行但作为静态 html 运行的应用程序的生产版本可以正常工作。此外,相对路径也可以正常工作。

如何加载 pdf 文件?

webpack.common.js

var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');

const path = require('path');
const rootDir = path.resolve(__dirname, '..');

module.exports = {
resolve: {
    extensions: ['.js', '.ts'],
    modules: [rootDir, path.join(rootDir, "node_modules")]
},

module: {
    rules: [
        {
            test: /\.html$/,
            loader: 'html-loader'
        },
        {
            test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
            loader: 'file-loader?name=assets/[name].[ext]'
        },
        {
           test: /\.(scss|css)$/,
           use: [
                { loader: "style-loader" },
                { loader: "css-loader" },
                { loader: "sass-loader",
                    options: {
                        includePaths: ["node_modules/"]
                    }
                }
            ]
        }
    ]},
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: ['app', 'vendor', 'polyfills']
        }),
        new HtmlWebpackPlugin({
            template: 'src/index.html'
        }),
        new webpack.ContextReplacementPlugin(
            /angular(\\|\/)core(\\|\/)@angular/,
            path.resolve(__dirname, '../src')
        )
    ]
};

webpack.dev.js

var webpackMerge = require('webpack-merge');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var commonConfig = require('./webpack.common.js');

const path = require('path');
const rootDir = path.resolve(__dirname, '..');

commonConfig.entry = {
    'polyfills': './src/polyfills.ts',
    'vendor': './src/vendor.ts',
    'app': './src/main.ts'
};

commonConfig.module.rules.unshift({
    test: /\.ts$/,
    loaders: ['awesome-typescript-loader', 'angular2-template-loader', 'angular-router-loader']
});

module.exports = webpackMerge(commonConfig, {

  devtool: 'cheap-module-eval-source-map',

  output: {
      path: path.resolve(rootDir, 'dist'),
      publicPath: 'http://localhost:8080/',
      filename: '[name].js',
          chunkFilename: '[name].chunk.js'
      },

      plugins: [
          new ExtractTextPlugin('[name].css')
      ],

      devServer: {
          historyApiFallback: true,
          stats: 'minimal'
      }
});

【问题讨论】:

  • 你能提供你的 webpack 配置文件的 sn-p 吗,请告诉资产文件夹中生成 pdf 的位置。
  • @PraveshKhatri 我已经添加了代码 sn-p。
  • 我认为您需要在 webpack.common.js 的文件加载器中添加 .pdf 扩展名,因为它会将您的文件放入 assets 文件夹中。您还有另一种方法,您可以通过 copyWebpackPlugin 将您的 pdf 复制到资产中的目标文件夹
  • @PraveshKhatri 我试过这样做,但它不起作用。可能是因为这个资产直到运行时才被 webpack 知道。

标签: javascript angularjs typescript pdf webpack


【解决方案1】:

您可以告诉 devServer 从何处提供文件。

devServer: {
  historyApiFallback: true,
  stats: 'minimal',
  contentBase: ['./dist', 'C:\\']
}

然后你可以用<... src="/file_name.ext" ... />加载你的文件

但我不建议将 C:\ 添加为 contentBase。如果有可能,请为生成的 PDF 定义另一个输出目录。

【讨论】:

  • 谢谢!有效。但是你为什么不推荐使用它呢?
  • 不错。因为它允许您包含 C 盘中的每个文件。
  • 好的。但对于当前的用例,这不会成为问题。欣赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2017-03-12
  • 2021-04-16
相关资源
最近更新 更多