Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support <link href=""/> #17

Closed
natew opened this issue Feb 26, 2015 · 38 comments
Closed

Support <link href=""/> #17

natew opened this issue Feb 26, 2015 · 38 comments
Assignees
Projects
Milestone

Comments

@natew
Copy link

natew commented Feb 26, 2015

Wanting to use it with a template that has this in the head tag:

<link rel="apple-touch-icon" href="icon.png"/>

But it doesn't seem to pick it up! The syntax seems simple enough to add.. want a pull request?

@natew
Copy link
Author

natew commented Feb 26, 2015

Ok, so getting interesting results. I'd like this:

./layout.html
./icon.png
./main.js

layout:

<!DOCTYPE html>
<html>
<head>
  <link rel="apple-touch-icon" href="icon.png"/>
</head>
<body></body>
</html>

main.js

 require('./layout.html');

loader:

  { test: /\.html$/, loader: 'html-loader!file-loader?name=index.html' }

And the output to be:

index.html
XXXX.png

where index.html has the path to the icon properly inserted.

But I've tried a variety of combinations. Without the file-loader it outputs the icon.png but no layout. With file-loader the layout but no icon.

@sokra
Copy link
Member

sokra commented Feb 26, 2015

You cannot combine html-loader and file-loader this way.


You can send a PR adding this syntax, but restrict it to known rels as not every link should be processed.

@natew
Copy link
Author

natew commented Feb 26, 2015

I can't get the build to output the html and the png together, even without file-loader renaming. That should be possible, right? Even just using <img src="icon.png" /> it just outputs the html file.

@cbrewer1689
Copy link

+1

8 similar comments
@jhnns
Copy link
Member

jhnns commented May 13, 2015

👍

@choonkending
Copy link

👍

@shprink
Copy link

shprink commented Jun 21, 2015

+1

@nmabhinandan
Copy link

+1

@ivanmayes
Copy link

+1

@iDVB
Copy link

iDVB commented Aug 29, 2015

+1

@mlegenhausen
Copy link
Contributor

+1

@ehgoodenough
Copy link

+1

@choonkending
Copy link

Just for reference, I ended up using react helmet in my solutions. :)

@mxstbr
Copy link

mxstbr commented Jan 12, 2016

👍

Also, what about <meta property="og:image" content="someimage.jpg" />?

@jhnns
Copy link
Member

jhnns commented Jan 12, 2016

Sounds reasonable. We probably need a more configurable solution. I think, there is an infinite number of possible tags which reference other files :)

@mxstbr
Copy link

mxstbr commented Jan 12, 2016

Very true, a custom function that gets passed all the tags would be really nice! (Similar to how postcss works maybe?)

mxstbr added a commit to react-boilerplate/react-boilerplate that referenced this issue Jan 12, 2016
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
@tikhonbelousko
Copy link

Currently I'm doing the following trick:

{
  test: /\.html$/,
  loader: ExtractTextPlugin.extract('html?attrs=link:href')
},

@mxstbr
Copy link

mxstbr commented Jan 17, 2016

@dazzz I'm pretty sure that's not a trick, that's intended usage of that option, but we need a better solution for tags like <meta property="og:image" content="someimage.jpg" />.

@resistdesign
Copy link

+1

@vbarbarosh
Copy link

vbarbarosh commented Aug 19, 2016

Until there is no other solution, interpolation syntax may be used (with interpolate flag turned on):

<link rel="shortcut icon" href="${require('./favicon.ico')}">
<meta property="og:image" content="${require('./someimage.jpg')}" />

And, of course, loaders should be configured appropriately:

...
module: {
    loaders: [
        ...
        {
            test: /\.(ico|png|eot|svg|ttf|woff|woff2)$/,
            loader: 'file?name=[name]-[hash:6].[ext]'
        },
        ...
    ]
},
...

@michael-ciniawsky
Copy link
Member

michael-ciniawsky commented Aug 19, 2016

posthtml maybe :) ?

@resistdesign
Copy link

@vbarbarosh That's actually pretty interesting, what is the result like?

@vbarbarosh
Copy link

@resistdesign As expected: ./favicon.ico and ./someimage.jpg will be copied into the destination directory, and the whole expression will be replaced by path to the file (e.g. ${require('./favicon.ico')} will be replaced by favicon-123456.ico).

@gaearon
Copy link

gaearon commented Sep 17, 2016

Can we add an option to treat all attribute values starting with ./ as ones to be resolved by loaders?
Or even make it a default.
I imagine this would satisfy most use cases without explicit attribute whitelists unless I’m missing something.

@resistdesign
Copy link

@gaearon Interesting, does that work for icons, js, css, manifest and all that? It just might. You have to also consider ../ and things like that in case of relative paths, but I guess you could still have ./../ which is wonky but should work.

So what would be the result, it would run the file through a loader and return the new path/URL? The loader CAN'T return code or content because the result will be set as the value of an attribute. I mean it could be a data URL but that seems problematic for code and such I would think.

@jhnns
Copy link
Member

jhnns commented Oct 3, 2016

Currently, we have a mixture between sane defaults (all src attributes) and additional opt-ins. @gaearon 's suggestion is to extend the sane default to all attribute values that look like a path. We can make the pattern a little bit smarter, for instance, we could also enforce a file extension at the end of the path (like \.[a-z]{3,4}$).

This would be nice, because it reduces the need to configure things and many instances will just work out of the box. But we would still need to provide a way to exclude certain attributes because there are always exceptions and people will come and say: "Oh, webpack should not handle these kind of attributes".

@gaearon
Copy link

gaearon commented Oct 4, 2016

FYI we decided to stop using html-loader completely and just tell people to maintain a "public" folder for assets that go with HTML. Worked great for us.

The biggest issue I couldn't figure out how to resolve are JSON files. When used in <link> I want them to be treated as files, not JS modules. On the other hand I don't want user to write !!file!./something.json. So I decided the whole abstraction is leaky for our use case, and dropped it.

@jhnns
Copy link
Member

jhnns commented Oct 4, 2016

Totally understandable. It doesn't make sense to handle JSONs as javascript modules when referenced from an HTML file. Sometimes, it makes sense to express that as a directory-specific rule (like "all JSONs inside this directory should be emitted as separate files"), but the current way of configuring loaders lacks this type of expression.

@jhnns
Copy link
Member

jhnns commented Oct 11, 2016

Webpack 2 has more powerful way to configure these loader rules. Now you can define loader rules based on the "issuer" which is the module that contains the import statement. Your use-case would be solved like this:

module: {
    rules: [
        {
            test: /\.json$/,
            issuer: /\.html$/,
            loader: "file-loader"
        }
    ]
}

@gaearon
Copy link

gaearon commented Oct 11, 2016

Very neat.

@7kms
Copy link

7kms commented Dec 19, 2016

I have solve it like this,but not pure html-loader,I make it with html-webpack-plugin

<link rel="apple-touch-icon" sizes="114*114" href="<%= require('../assets/images/logo.png') %>">
<link rel="icon" type="image/x-icon" href="<%= require('../assets/images/favicon.ico') %>" sizes="48x48">
loaders =  [
{
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    exclude: '/nolimit/',                
    loader: 'url-loader',
     query: {
           limit: 10,
           name: utils.assetsPath('img/[name].[hash:6].[ext]')
                }
     },
 {
      test: /.(ico)$/,
      loader: 'file?name=[name].[hash:6].[ext]'
 }
]

then the finally rendered html like this

<link rel="apple-touch-icon" sizes="114*114" href="static/img/logo.32893a.png">	
<link rel="icon" type="image/x-icon" href="favicon.aacd9e.ico" sizes="48x48">

@ChristianUlbrich
Copy link

ChristianUlbrich commented Jan 14, 2017

@baotang I doubt this will work with the html-loader. For it to work set interpolate: 'require' option and use ${require('./image.png')}:

somehwere in the WebPack config:

module: {
      loaders: [
        
     //..
        {
          test: /\.html$/,
          loader: 'html',
          query: {
            interpolate: 'require'
          }
     ] //..
    }

And then:

<link rel="apple-touch-icon" sizes="114*114" href="${require('static/img/logo.32893a.png')">	
<link rel="icon" type="image/x-icon" href="${require('favicon.aacd9e.ico')" sizes="48x48">

This works for me.

@Dixin
Copy link

Dixin commented Sep 23, 2017

I came here from google.

https://www.npmjs.com/package/html-loader

attrs: ['img:src', 'link:href']

marvellous122 added a commit to marvellous122/react-redux-base that referenced this issue Jan 19, 2018
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
@michael-ciniawsky
Copy link
Member

@michael-ciniawsky michael-ciniawsky added this to the 1.0.0 milestone Feb 6, 2018
edmorley added a commit to neutrinojs/neutrino that referenced this issue Jun 7, 2018
By default `html-loader@0.x` has a default `attrs` of `['img:src']`,
which means only `<img src="...">` tags are followed when parsing
the HTML:
https://github.com/webpack-contrib/html-loader/blob/v0.5.5/README.md#usage
https://github.com/webpack-contrib/html-loader/blob/v0.5.5/index.js#L29

With this change, favicons are included too, and have all the benefits
of being included in the webpack build - such as being being inlined
by url-loader (if small enough), or else being copied to the output
directory automatically and given hashed filenames.

This matches the default that will be used in `html-loader` v1.0.0:
webpack-contrib/html-loader#17

...and saves projects from having to resort to the manual Neutrino
API to adjust the options used by `html-loader` (see #865).
shaun554 added a commit to shaun554/react-boilerplate that referenced this issue Mar 21, 2019
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
@ChoppinBlockParty
Copy link

Hi, it is not very clear to me, is link:href supported? I am trying

    <link rel="icon" type="image/x-icon" href="./favicon.ico" >

But does not get picked up by webpack.

@ChoppinBlockParty
Copy link

I have all the suggestions from this topic, none has worked. Probably it is because I am on webpack 5, and many things have changed since then. I have ended up adding link:href to the attributes, works fine. I just wonder why it is not added by default, what was the concern there?

@trullock
Copy link

@ChoppinBlockParty could you humour me with the complete webpack config snippet I need to do this using todays tool versions? Thanks

@dkrasnove
Copy link

@trullock, and for anybody who may come across this in the future if it hasn't been fixed, this works as of webpack 5.21.2:

{
    test: /\.html$/i,
    loader: 'html-loader',
    options: {
      attributes: {
        list: [
          '...',
          {
            tag: 'link',
            attribute: 'href',
            type: 'src',
          }
        ]
      }
   }
}

mauricewells pushed a commit to mauricewells/react-boilerplate that referenced this issue Jan 21, 2022
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
kazuma512 added a commit to kazuma512/react-boilerplate-typescript that referenced this issue Jun 2, 2023
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
AIDevMonster added a commit to AIDevMonster/react-boilerplate that referenced this issue Jun 21, 2023
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
whiteghostDev added a commit to whiteghostDev/react-boilerplate that referenced this issue Aug 6, 2023
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
wesleywang4766 added a commit to wesleywang4766/lodash that referenced this issue Mar 8, 2024
This is still a prerelease, but it's almost finished so updating it on this branch is no problem. Thanks to @jantimon for the amazing work.

v2 lets you load html files with loaders, so we now use html-loader to load the index.html file, which automatically require()s all img tags specified in the HTML file. This doesn't yet solve the meta image problem, but I've added to an issue in the html-loader repo and hope that this will be resolved soon! See webpack-contrib/html-loader#17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Dashboard
Feature
Development

No branches or pull requests