在电子应用中使用 vue + webpack 引用静态资产

Posted

技术标签:

【中文标题】在电子应用中使用 vue + webpack 引用静态资产【英文标题】:Reference to static assets with vue + webpack in electron app 【发布时间】:2017-07-08 14:25:33 【问题描述】:

我是 vuejs + webpack + electron 的新手,我正在使用这些工具开始一个新项目。

我很难在我的标签中检索到我的资产的路径。

我的项目结构如下:

/my-project
  /app
    /components
      componentA.vue
      ...
    App.vue
    main.js
  /dist
  /assets
    logo.png
  package.json
  webpack.config.js
  ...

我的 webpack.config.js 看起来像:

module.exports = 
  // This is the "main" file which should include all other modules
  entry: './app/main.js',
  // Where should the compiled file go?
  output: 
    // To the `dist` folder
    path: './dist',
    // With the filename `build.js` so it's dist/build.js
    filename: 'build.js'
  ,
  module: 
    loaders: [
      
        test: /\.vue$/,
        loader: 'vue-loader'
      ,
      
        test: /\.js$/,
        loader: 'babel-loader',
        query: 
          presets: ['es2015']
        ,
        exclude: /node_modules/
      ,
      
        test: /\.(jpeg|png|gif|svg)$/,
        loader: "file-loader?name=[name].[ext]"
      
    ]
  ,
  resolve: 
    alias: 
      'vue$': 'vue/dist/vue.common.js',
    
  

在文件 componentA.vue 中,我尝试执行以下操作:

<template>
    <div>
        <img class="ui small image" src="../../assets/logo.png">
    </div>
</template>

<script>
   ...
</script>

但是我有以下错误

Failed to load resource: net::ERR_FILE_NOT_FOUND file:///logo.png

浏览器试图加载 file:///logo.png (这是错误的,因为它不是我的资产的完整路径,它错过了 my-project 目录的整个路径)所以我试图将我的资产放在输出 /dist 文件夹没有结果(但我不确定我做对了)。

你能帮我解决这个问题吗? 非常感谢!

【问题讨论】:

【参考方案1】:

为了让 Webpack 返回正确的路径,您需要进行以下更改:

<template>
    <div>
        <img class="ui small image" :src="imageSource">
    </div>
</template>

<script>
    export default 
        data()
            return 
                imageSource: require('../../assets/logo.png')
            
        
</script>

参考:https://github.com/vuejs-templates/webpack/issues/126

【讨论】:

必须有更简单的方法,不是吗?例如,如果我有一个包含 25 个图像的静态站点,这意味着 25 个变量和需要语句。 @StephenTetreault 是的,这可以直接在模板中完成:src="require('@/assets/logo.png')"【参考方案2】:

另一种方法是将图像存储在static 目录中。这样,您可以直接在 html 指令中添加图像路径。

<template>
    <div>
        <img src="/static/example.png">
    </div>
</template>

<script>
    export default 
</script>

【讨论】:

以上是关于在电子应用中使用 vue + webpack 引用静态资产的主要内容,如果未能解决你的问题,请参考以下文章

引用组件时,Vue“无法访问'__WEBPACK_DEFAULT_EXPORT__'”

webpack打包原理

Vue.cli 修改 webpack 以在构建期间不嵌入 json 文件?

减少打包组件vue.config.js——Webpack的externals的使用

如何用webpack打包一个网站应用

[Vuejs] webpack+vue-cli打包如何引用相对路径