Comments (15)
Sorry, I am just very busy,
Good luck with whatever keeps you occupied! :)
I try your repo tomorrow.
Thanks!
from pug-loader.
- Are you using the HtmlWebpackPlugin in your project? If yes, whether using in PUG external variables, e.g.:
div= htmlWebpackPlugin.options.title
- Did this bug appear after update to v1.6.3 or is it a new case?
Could you please create a simple repo with the file unsupported-browser.pug
and all other dependencies in this template.
I need the source of unsupported-browser.pug
and webpack.config.js
.
from pug-loader.
In this case I am using the default function output. I discovered the problematic code is:
link(rel="preload" href=require('assets/fonts/ibm-plex-sans-v7-latin-regular.woff2') as="font" type="font/woff2" crossorigin)
which then goes to the webpack file-loader
This code worked with webdiscus 1.4 but broke with 1.6. I think perhaps the version should have been bumped to 2.x?
Perhaps 1.6 is doing something funky with require
.
from pug-loader.
the error Cannot read properties of undefined (reading 'undefined')
has not a relation with it the require()
.
If the required resource is not found (e.g. wrong resolved path), it will display some like Can't resolve the file ...
.
To locate the problem I need more information:
- Are you using the
HtmlWebpackPlugin
in your project? If yes, are external variables used in the pug template? e.g.:
div= htmlWebpackPlugin.options.title
- Is used Webpack 4 or 5?
- What version of pug-loader was used? 1.6.0, 1.6.1, 1.6.2, 1.6.3?
I have created the test case for require fonts.
With Webpack 5 it works
index.pug
, where the 'assets/fonts/
is relative path by the the template
html
head
link(rel="preload" href=require('assets/fonts/ibm-plex-sans-v7-latin-regular.woff2') as="font" type="font/woff2" crossorigin)
body
p Hello World!
img(src=require('image.jpeg'))
webpack.config.js
const path = require('path');
const PugPlugin = require('pug-plugin');
module.exports = {
output: {
path: path.join(__dirname, 'public/'),
publicPath: '/',
},
entry: {
index: 'src/index.pug', // the `pug-plugin` is required
},
plugins: [
new PugPlugin() // extract HTML from pug defined in webpack entry and save to separate file
],
module: {
rules: [
{
test: /\.pug$/,
loader: PugPlugin.loader, // `@webdiscus/pug-loader` is already included in PugPlugin
options: {
method: 'render', // export the HTML string, rendered at compile time
},
},
{
test: /\.(png|jpg|jpeg)/,
type: 'asset/resource', // <= must be exact this to handles an image
generator: {
filename: 'assets/images/[name].[hash:8][ext]', // save required image under this filename
},
},
{
test: /\.(eot|ttf|woff|woff2)/,
type: 'asset/resource', // <= must be exact this to handles an font
generator: {
filename: 'assets/fonts/[name][ext]', // save required font under this filename
},
},
],
},
};
What is difference by usage require()
to compare with your case? I think the problem is elsewhere.
The file-loader
is deprecated for Webpack 5, link to file-loader doc.
For Webpack 5 should be used assets module.
From ver 1.6 I have "improved" the resolving of required resources. The "interpolation" of paths was replaced with "evaluation" of once. Now is possible use a variable in require('path/to/images/${myImage}')
at compile time. Added resolving of paths from tsconfig.js
.
from pug-loader.
Thank you for the investigation. Unfortunately I can't use the assets modules as it's not as flexible when it comes to the output paths.
I am trying to make a reproducible small test case, which is not that easy. :)
from pug-loader.
I suspect method: "compile"
is for some reason not being used.
https://github.com/Rush/webdiscus-issue-9-repro
I also suspect file-loader has nothing to do with it. It's an issue purely in pug-loader
. Please check out my repo and follow README.
from pug-loader.
In regards to file-loader
I need more granularity as for where to output the files. I believe webpack doesn't expose such granular options for assets.
const fileLoader = {
loader: 'file-loader',
options: {
esModule: false,
outputPath: '../public-built',
context: path.resolve(__dirname),
publicPath: '/',
name: '[hash].[ext][query]'
},
};
from pug-loader.
Just wondering if you were able to run my repo and reproduce?
from pug-loader.
Just wondering if you were able to run my repo and reproduce?
Sorry, I am just very busy, I try your repo tomorrow.
Thank you for the repo!
from pug-loader.
yes, I can reproduce the issue and I found the place in the code. I will fix it.
Thank you for very important issue report.
from pug-loader.
The problem is by usage variables in template.
At pre compile time the usage of variables like opts.prop1.prop2
or opts[prop1]
has issue because they are not defined. Only in runtime will be passed variables available. This is the BUG :-/
Temporary solution
Anywhere in PUG use ?.
notation (node >= 14) by each variable with a property. Use this only in JS context, not in PUG context, e.g.:
you use already the correct chained properties with ?.
:
- const osName = parsedUA?.os?.name; // RIGHT!
In your template unsupported-browser.pug
you should change:
this
span.browser-icon
+svgIcon(browserIcons[recommendedBrowser])
to
span.browser-icon
- const icons = browserIcons?.[recommendedBrowser];
+svgIcon(icons)
and in mixin self use properties with ?.
:
mixin svgIcon(iconData, currentColor = 'currentColor')
- const [width, height, _, __, paths] = iconData?.icon || [];
...
I understand, this is not comfortable and tricked, sorry, but currently this works with this limitation.
P.S. I try to fix it, but it is not easy and not quick.
from pug-loader.
The workarounds seem really messy. I will stick with the old version.
Probably variable
existence check should only be applied to html
render mode.
from pug-loader.
Hello @Rush,
in the new version 1.7.0
I have fixed the issue undefined variable
by usage the compile
method.
This was a compromise for compile
method:
- (v1.6.x) full support for resource resolving, but object property must be used with
?.
-VS- - (v1.4.x, v.1.7.x) limited support for resource resolving ( see in resolve resources the table below ) but usage an object property is w/o
?.
But the same limitation has original pug-loader. The problem is with webpack require. My solution in v1.6. was a mega useful "killer-feature", no other pug-loader does this.
Do you can please try to test the version 1.7.0?
from pug-loader.
Yes thank you. This is now solved. There is another issue for which I'll open a different ticket.
from pug-loader.
from pug-loader.
Related Issues (20)
- Failed to build when webpack alias for asset is an array of paths instead of a single path HOT 5
- [CRITICAL] [SECURITY] Pug variables leak between different executions of rendered templates HOT 10
- Path errors on Windows? HOT 6
- How to use it with tailwindcss and server side rendering? HOT 13
- [Bug] Pug error in dependency requires restart of webpack HOT 9
- Support resolving modules HOT 1
- Compile error on bad JS Syntax is confusing HOT 3
- Support Webpack defined modules HOT 4
- Missing peer dependency pug-walk HOT 3
- Cannot read properties of undefined (reading 'sync') in @webdiscus\pug-loader\src\Resolver.js HOT 2
- Vue production build errors in example HOT 6
- hello-world-app does not compile HOT 3
- webpack-dev-server: pages require access with .html HOT 7
- Doesn't fix indent pug with @webdiscus/pug-loader on nuxt 3 (vite) HOT 3
- Will this support pug3? HOT 2
- Improve the error message to find where the error occurred HOT 2
- `include` doesn't use dynamic `resolve.alias` (from tsconfig-paths-webpack-plugin) HOT 11
- img srcset attribute HOT 3
- htmlWebpackPlugin.options not available in pug template HOT 10
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pug-loader.