如何使用 webpack 2 加载 elm 代码中使用的图像?

how to load images used in elm code with webpack 2?

假设我有这个视图函数:

view: Model -> Html Msg
view model = 
    img [ src "static/img/elm.jpg" ] []

如何确保 webpack 2 知道它并按预期将其加载到 dist 文件夹中?

我找到了 elm-asssets-loaderhere - 这是为这个场景构建的 - 但我不明白如何使用它。 我的 webpack.config.js 是:

module: {
   rules: [
        ...
       {
           test: /\.elm$/,
            exclude: [/elm-stuff/, /node_modules/],
            use: [{
                    loader: 'elm-hot-loader'
                  },
                  {
                      loader: 'elm-webpack-loader?verbose=true&warn=true&debug=true'
                  },
                  {
                      loader: 'elm-assets-loader?module=MyAssets&tagger=AssetPath'
                  },

            ]
        },


  ] 

}

我在扩展坞中看到了 elmAssetsLoaderfileLoader 自定义函数 - 但不清楚将它们放在哪里。我尝试将它们放在 module.exports object 内、modules 内、plugins 内。每次出现此错误时: Webpack has been initialized using a configuration object that does not match the API schema...

我也试过在 elm--webpack-loader 前后放置 elm-assets-loader。当放在 elm-webpack-loader 之后时 - 我在 Main.elm 文件中得到一个错误 - 这是有线的,因为 Main.elm 很好。没有错。

当我把它放在 elm-webpack-loader 之前时,绝对没有任何反应。甚至没有警告信息。

我也有 2 个模块,按照说明:

-- module MyAssets exposing (..)
--
-- type AssetPath
--     = AssetPath String
--
-- elmImage : AssetPath
-- elmImage =
--     AssetPath "../static/img/elm.jpg" -- this is the location of my image, and it's correct.
--

和带有图像的视图模块:

module View exposing (..)
view = 
   img [ src "what to put in here?" ] []

我是 webpack 的新手,这可能就是为什么我不明白我应该做什么。我想了解全局。连接方式。

我的 Html.Attributes.src 函数中应该包含什么?

我盲目地尝试了很多东西。 None 他们成功了。我缺乏直觉。

有人可以清楚地说明 elm image/assets loadingwebpack 2 中的实际工作原理吗?谢谢:)

我会用 Copy Webpack Plugin 简单地复制这些图像。在你的 webpack 配置插件列表中推送这个:

new CopyWebpackPlugin({
    from: '',
    to: ''
})

另一种方法是管理来自 CSS 的图像并使用文件加载器:

{
   test: /\.(jpg|png)$/,
   use: `file-loader?${ objToUrlParameters({

          name: 'assets/img/[name].[hash:6].[ext]',
          publicPath: options.publicPath

        })
      }`
},

我最终使用了 CopyWebpackPlugin from here

 plugins: [ 
    ...
    new CopyWebpackPlugin([
       { from: './src/static/img', to: 'img' }
    ])
 ]

我不使用我读过的异步内容 - 但足以满足我在这里的需要。

我将等待另一个答案将其标记为已接受 - 如果它可以提供使用加载程序的解决方案。在那之前,遇到这个问题的人可以尝试使用这个复制插件。

I also tried placing the elm-assets-loader before and after the elm--webpack-loader

elm-assets-loader 获取 elm-webpack-loader 的输出并在编译的 JavaScript 中查找资产路径。当 webpack 在 use 配置 from bottom to top 中应用加载器时,你需要像

use: [{
        loader: 'elm-hot-loader'
    },
    {
        loader: 'elm-assets-loader?module=MyAssets&tagger=AssetPath'
    },
    {
        loader: 'elm-webpack-loader?verbose=true&warn=true&debug=true'
    },
]

And when i place it before elm-webpack-loader absolutely nothing happens. Not even a warning message.

这可能是由于未在加载程序配置中指定正确的 package。如果您的 elm-package.jsonrepository 而不是 "https://github.com/user/project.git",您需要指定包裹:

// when the repository is "https://github.com/alon/elmapp.git"
loader: 'elm-assets-loader?module=MyAssets&tagger=AssetPath&package=alon/elmapp'    

这是必需的,因为 elm-assets-loader 寻找 JavaScript 代码如下:

_<package-user>$<package-project>$<module>$<tagger>("../static/img/elm.jpg")

如果包配置不正确,它将无法找到它应该找到的东西。

img [ src "what to put in here?" ] []

您需要一个辅助函数来提取包含在 AssetPath 变量中的字符串值。

module MyAssets exposing(AssetPath(..), path, elmImage)

path : AssetPath -> String
path (AssetPath str) =
    str

-- 

view = 
    img [ src <| MyAssets.path <| MyAssets.elmImage ] []