无法解决与 webpack 4 和 bower 的依赖关系
Can't resolve dependencies with webpack 4 and bower
我正在尝试将我的应用程序与 webpack 4 捆绑在一起,它是一个基于 Polymer 的应用程序,依赖于 bower 和 HTML 个文件
这是我的 webpack 配置:
'use strict';
const webpack = require('webpack');
/* global __dirname module require */
/* eslint comma-dangle: ["error", "never"] */
const path = require('path');
module.exports = {
entry: './my-entry.html',
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, './dist'),
publicPath: 'dist/'
},
resolve: {
modules: ['bower_components', 'node_modules'],
descriptionFiles: ['package.json', 'bower.json']
},
devtool: 'inline-source-map',
module: {
rules: [
{
test: /\.html$/,
use: [
{ loader: 'babel-loader' },
{ loader: 'polymer-webpack-loader' }
]
},
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['env']
}
}
]
}
]
}
};
而当我运行 webpack时,我有以下错误:
ERROR in ./my-page.html
Module not found: Error: Can't resolve '../util-custom-types/imports/currency.html' in 'C:\Workspaces\my-project'
resolve '../one-package/imports/currency.html' in 'C:\Workspaces\my-project'
using description file: C:\Workspaces\my-project\package.json (relative path: .)
此导入 ../util-custom-types/imports/currency.html
位于 bower_components/util-custom-types/imports/currency.html
内,当我 运行 polymer serve
没有捆绑时,它有效。
看起来 webpack 里面少了什么东西
resolve: {
modules: ['bower_components', 'node_modules'],
因为它不会在这些文件夹中查找文件。
这是失败的导入之一
<link rel="import" href="../util-custom-types/imports/currency.html">
我尝试了网上的一些插件,但是由于 webpack 4 还很新,所以很多都不能用。
我知道如果我使用导入 links 指向 bower_components
文件夹,像这样,<link rel="import" href=".bower_components/util-custom-types/imports/currency.html">
它会工作,但这不是一个有效的解决方案,因为一些的组件也有相同的导入方式,我无法修改。
所以,总而言之,我想使用 html 导入,指向 bower_components 文件夹,如下所示:
<link rel="import" href="../util-custom-types/imports/currency.html">
到位于
的文件
./bower_components/util-custom-types/imports/currency.html
在 webpack 4 中,没有引用 bower_components 文件夹。
有人做到了吗?
编辑:
我创建了一个示例 github 项目,其中只有一个从 polymer init 创建的组件和一个 webpack 配置。
https://github.com/vlaraort/demo_polymer_webpack
重要的是成为一个组件,而不是一个应用程序,
因为聚合物的 html 进口没有指向凉亭组件,而在应用程序中,聚合物的 html 进口指向 bower_components.
组件:
<link rel="import" href="../polymer/polymer-element.html">
申请:
<link rel="import" href="../bower_components/polymer/polymer-element.html">
要安装,npm i & bower i
到运行工作聚合物服务npm run polymer:dev
运行 不工作的 webpack 服务 npm run webpack:dev
正如您在 webpack:dev
中看到的那样,聚合物元素导入正试图从 http://localhost:8080/polymer/polymer-element.html
而不是 http://localhost:8080/bower_components/polymer/polymer-element.html
获取,但它失败了。
所以,问题的 objective 是了解 polymer serve 对进口的神奇作用,因为它解决了这个 link
<link rel="import" href="../polymer/polymer-element.html">
到 bower_components,以及如何在 webpack 中重现该行为。
谢谢!
相关导入应该可以正常工作。你只需要告诉 webpack 解析 html 个文件。
添加 html
到扩展名列表。
resolve: {
modules: ['bower_components', 'node_modules'],
descriptionFiles: ['package.json', 'bower.json'],
extensions: ['.js', '.json', '.html']
},
编辑:
示例项目有助于理解这里的问题。
该错误实际上与 webpack 无关。 webpack 从不接触 demo
中的文件。 webpack-dev-server
只加载根目录中的 index.html
,它重定向到 demo
。但没有任何事情得到遵守。这与您 运行 此目录中的任何其他网络服务器相同。
您可以通过 运行ning 在没有开发服务器的情况下仅 webpack
看到这一点。它只是编译 index.html
.
让我试着解释一下你想做什么。
首先,您需要使用 html-webpack-plugin 之类的内容加载根 index.html
文件。此文件不应被捆绑,否则我们无法加载任何内容。
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './index.html'),
inject: false
}),
在此文件中,您现在需要加载其他所有内容。再加上做一些聚合物魔术。 demo application of the polymer-webpack-loader explains this.
最后,定义您的 webpack 入口点。这些现在是您的组件。使用相对路径从其中加载的所有内容,包括来自 bower_components
的内容,都应该可以正常工作。 Webpack 将解决它们并将所有内容捆绑在一起。
加载程序中的演示应用程序很有帮助,看看它们的实现。
抱歉,解决方案并不像我第一次那么简单。希望对您有所帮助。
我正在尝试将我的应用程序与 webpack 4 捆绑在一起,它是一个基于 Polymer 的应用程序,依赖于 bower 和 HTML 个文件
这是我的 webpack 配置:
'use strict';
const webpack = require('webpack');
/* global __dirname module require */
/* eslint comma-dangle: ["error", "never"] */
const path = require('path');
module.exports = {
entry: './my-entry.html',
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, './dist'),
publicPath: 'dist/'
},
resolve: {
modules: ['bower_components', 'node_modules'],
descriptionFiles: ['package.json', 'bower.json']
},
devtool: 'inline-source-map',
module: {
rules: [
{
test: /\.html$/,
use: [
{ loader: 'babel-loader' },
{ loader: 'polymer-webpack-loader' }
]
},
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['env']
}
}
]
}
]
}
};
而当我运行 webpack时,我有以下错误:
ERROR in ./my-page.html
Module not found: Error: Can't resolve '../util-custom-types/imports/currency.html' in 'C:\Workspaces\my-project'
resolve '../one-package/imports/currency.html' in 'C:\Workspaces\my-project'
using description file: C:\Workspaces\my-project\package.json (relative path: .)
此导入 ../util-custom-types/imports/currency.html
位于 bower_components/util-custom-types/imports/currency.html
内,当我 运行 polymer serve
没有捆绑时,它有效。
看起来 webpack 里面少了什么东西
resolve: {
modules: ['bower_components', 'node_modules'],
因为它不会在这些文件夹中查找文件。
这是失败的导入之一
<link rel="import" href="../util-custom-types/imports/currency.html">
我尝试了网上的一些插件,但是由于 webpack 4 还很新,所以很多都不能用。
我知道如果我使用导入 links 指向 bower_components
文件夹,像这样,<link rel="import" href=".bower_components/util-custom-types/imports/currency.html">
它会工作,但这不是一个有效的解决方案,因为一些的组件也有相同的导入方式,我无法修改。
所以,总而言之,我想使用 html 导入,指向 bower_components 文件夹,如下所示:
<link rel="import" href="../util-custom-types/imports/currency.html">
到位于
的文件./bower_components/util-custom-types/imports/currency.html
在 webpack 4 中,没有引用 bower_components 文件夹。
有人做到了吗?
编辑:
我创建了一个示例 github 项目,其中只有一个从 polymer init 创建的组件和一个 webpack 配置。
https://github.com/vlaraort/demo_polymer_webpack
重要的是成为一个组件,而不是一个应用程序, 因为聚合物的 html 进口没有指向凉亭组件,而在应用程序中,聚合物的 html 进口指向 bower_components.
组件:
<link rel="import" href="../polymer/polymer-element.html">
申请:
<link rel="import" href="../bower_components/polymer/polymer-element.html">
要安装,npm i & bower i
到运行工作聚合物服务npm run polymer:dev
运行 不工作的 webpack 服务 npm run webpack:dev
正如您在 webpack:dev
中看到的那样,聚合物元素导入正试图从 http://localhost:8080/polymer/polymer-element.html
而不是 http://localhost:8080/bower_components/polymer/polymer-element.html
获取,但它失败了。
所以,问题的 objective 是了解 polymer serve 对进口的神奇作用,因为它解决了这个 link
<link rel="import" href="../polymer/polymer-element.html">
到 bower_components,以及如何在 webpack 中重现该行为。
谢谢!
相关导入应该可以正常工作。你只需要告诉 webpack 解析 html 个文件。
添加 html
到扩展名列表。
resolve: {
modules: ['bower_components', 'node_modules'],
descriptionFiles: ['package.json', 'bower.json'],
extensions: ['.js', '.json', '.html']
},
编辑:
示例项目有助于理解这里的问题。
该错误实际上与 webpack 无关。 webpack 从不接触 demo
中的文件。 webpack-dev-server
只加载根目录中的 index.html
,它重定向到 demo
。但没有任何事情得到遵守。这与您 运行 此目录中的任何其他网络服务器相同。
您可以通过 运行ning 在没有开发服务器的情况下仅 webpack
看到这一点。它只是编译 index.html
.
让我试着解释一下你想做什么。
首先,您需要使用 html-webpack-plugin 之类的内容加载根 index.html
文件。此文件不应被捆绑,否则我们无法加载任何内容。
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './index.html'),
inject: false
}),
在此文件中,您现在需要加载其他所有内容。再加上做一些聚合物魔术。 demo application of the polymer-webpack-loader explains this.
最后,定义您的 webpack 入口点。这些现在是您的组件。使用相对路径从其中加载的所有内容,包括来自 bower_components
的内容,都应该可以正常工作。 Webpack 将解决它们并将所有内容捆绑在一起。
加载程序中的演示应用程序很有帮助,看看它们的实现。
抱歉,解决方案并不像我第一次那么简单。希望对您有所帮助。