- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 React 应用程序(学生门户)。
我的文件夹结构如下:
\- build
- webpack.config.js
\- src
- App.js
- components\
- Login\
- Login.scss
- Login.js
- Dashboard\
- Register\
- redux\
- helpers\
我的 webpack 非常标准。
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: './src/app.js',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'app.bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}
]
},
stats: {
colors: true
},
devtool: 'source-map'
};
我想在此应用程序之上构建。所以我将这个应用程序发布到 npm(本地)。我的文件夹结构现在是:
\- node_modules
- student-portal\
\ - src\
\ - build\
我想要的是能够替换/扩展现有组件,而不必复制现有文件。
所以,如果我创建一个新文件,我希望 webpack 使用它。如果这个文件不存在,它应该查看 node_modules/student-portal\src
。
所以 webpack 应该首先查看 src
文件,然后再查看 node_modules\student-portal\src
。
我尝试创建一个解析器函数:
var MyResolver = {
apply: function(resolver) {
resolver.plugin('module', function(request, callback) {
console.log(request.request); // this only consoles node_modules not .js files
});
}
};
但这并不能控制 .js 文件。我还尝试过许多其他插件,如 NormalModuleReplacementPlugin、ResolverPlugin 等,但都没有成功。
如果文件不存在,任何关于我如何利用 webpack 解析和替换路径的指示将不胜感激。理想情况下,我想扩展现有组件并让 webpack 将旧组件的路径替换为新组件的路径。
最佳答案
我想你可以使用 resolve.modules
选项,因为它会按照您的描述进行操作。但是,由于问题是关于 resolve 插件的,所以我也会尝试编写一个。
这是一个以 lodash
作为目标模块的例子。我们可以设置这样的结构:
node_modules
`--lodash
src
|--lodash
| `-- zip.js
`-index.js
zip.js
可以像 export default () => 'local zip'
在我们的 webpack.config.js
中,做
module.exports = {
...
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules'],
},
...
}
在我们的 index.js 中,让我们导入 zip
和 isObject
。
// src/index.js
import zip from 'lodash/zip';
import isObject from 'lodash/isObject';
console.log(zip()); // 'local zip'
console.log(isObject({ a: 100 })); // 'true'
这基本上就是您想要的,但您不是编写自定义组件的相对路径,而是编写模块路径。
但既然问题问的是插件,那就试试看吧!我之前评论过你的问题,但后来发现插件系统在 webpack 4 中发生了变化。我在节点 v10 上,所以一些语法在旧版本中可能不起作用。
目录结构:
node_modules
`--lodash
src
|--components
| `-- zip.js
`-index.js
首先,快速浏览一下解析插件。 Webpack 允许我们在解析管道(you can see the full list here)中使用多个钩子(Hook)。我们对 resolve
、parsedResolve
和 module
特别感兴趣。我们的计划是:
1. Tap into the `resolve` hook
2. Is the resolve request points to our 'components' folder?
- If not, go to **step 3**.
- If yes, is there something there it can use?
- If not, point it to `lodash` module instead.
- If yes, go to **step 3**.
3. Continue to the next hook in the pipeline (`parsedResolve`).
当我们点击一个钩子(Hook)时,我们会得到一个非常有用的 request
对象,其中包含这些属性:
context
:包含发行者(index.js
的绝对路径)path
:发布者的目录(src
的绝对路径)request
: 请求字符串('./components/zip')有了它,我们就可以编写我们的插件了:
const path = require('path');
const fs = require('fs');
class CustomResolverPlugin {
constructor ({ dir, moduleName }) {
this.dir = dir; // absolute path to our 'components' folder
this.moduleName = moduleName; // name of the module, 'lodash' in this case
}
apply(resolver) {
resolver.getHook('resolve').tapAsync('CustomResolverPlugin', (request, resolveContext, callback) => {
// 1. check if the request is point to our component folder
// resolver.join is same as path.join, but memoized
const { dir } = path.parse(resolver.join(request.path, request.request));
const match = dir === this.dir;
if (match) {
// 2. get the name of the file being requested & check if it exists.
// in import zip from `./src/components/zip`, 'zip' is the name.
const { name } = path.parse(request.request);
const pathExist = fs.existsSync(path.join(this.dir, `${name}`));
if (!pathExist) {
// create a new request object.
// we'll swap the request to something like 'lodash/zip'
const _request = {
...request,
request: `${this.moduleName}/${name}`
}
// swap the target hook to 'module' to resolve it as a module.
const _target = resolver.ensureHook('module');
return resolver.doResolve(_target, _request, null, resolveContext, callback);
}
}
// 3. otherwise continue to the next hook
const target = resolver.ensureHook('parsedResolve');
return resolver.doResolve(target, request, null, resolveContext, callback);
});
}
}
webpack.config.js
中的用法
module.exports = {
...
resolve: {
plugins: [
new CustomResolverPlugin({
dir: path.resolve(__dirname, './src/components'),
moduleName: 'lodash',
}),
],
},
...
}
在你的 index.js 中:
import zip from './components/zip';
import isObject from './components/isObject';
console.log(zip(['a', 'b'], [1, 2])); // 'local zip'
console.log(isObject({ a: 100 })); // true
希望对您有所帮助!
关于javascript - 利用 webpack resolve/loader 添加后备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54320025/
我正在使用 webpack 开始我的学习之路,但遇到了一个问题,我认为这是由 extract-loader 引起的。 .当webpack抓取我的HTML文件时,似乎无法正常编译,在使用import.m
我正在使用 tomcat 8,在 tomcat-home/config/catalina.properties ,有关于的部分 common.loader, server.loader and sha
在使用 import 语句时,我对区分 sass-loader 和 css-loader 有点困惑。据我所知,css loader resolve import statment(@import) 和
我的 webpack 加载器数组中有这个加载器: { test: /\.scss$/, exclude: /node_modules/, loaders: ExtractTextPlugin('sty
我对 url-loader 、 file-loader 和 image-loader 感到很困惑。谁能解释一下 url-loader 、 file-loader 和 image-loader 的区别是
我有 page.css @imports index.css。 page.css 和 index.css 都有 display: flex Webpack.config.js 包含: module:
我在 webpack 中使用生产模式构建的多入口点最终 bundle 中导出的多入口编译 js 文件始终包含加载器内容。如何消除它们以及为什么包含它们? 重现 git clone https://gi
模板加载器找到模板但未加载模板 TemplateDoesNotExist at /cardpayment/ cardpayment.html Request Method: GET Reque
当我尝试运行 gradle tR (tomcatRun) 时出现此错误 A child container failed during start java.util.concurrent.Execu
Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/projectna
我计划将 Webpack 用于一个项目,并且我正在使用 Html-loader + file-loader 设置我的工作流程,以获取带有图像动态 src 的生产 html 文件,正如 Colt Ste
我有一个巨大的 csv 文件,其中包含数百万条记录,我想使用 python 脚本将它加载到 Netezza 数据库中。我尝试了简单的插入查询,但速度非常非常慢。可以指出一些示例 python 脚本或一
我想将 ts-loader 与 babel-polyfill 一起使用,但不使用 babel-loader。但是当我尝试构建该项目时,我收到了此错误。谁能告诉我我缺少什么。 ERROR in ./sr
下面是我的 webpack.config.js 和 package.json module.exports = { entry: "./entry.js", output: { fi
我在两台不同的 PC 上遇到了一个问题。对于我的项目,我为开发安装了以下依赖项:(webpack webpack-cli @babel/core @babel/preset-env @babel/pr
模板文件保存在app目录下,但渲染时引发TemplateDoesNotExist异常: 模板加载器事后分析如下: Django 尝试按以下顺序加载这些模板: Using loader django.t
PHPUnit 手册说: If you point the PHPUnit command-line test runner to a directory it will look for *Test
我正在开发一个需要 html 的角度应用程序要提取为纯 HTML 文件的文件,同时应检查任何 要求这些图像(作为 Assets )。另外,图片是基于根路径的(所以 /images/something.
我们在 sql 加载器中遇到了问题。我们正在尝试将一个大约 46 亿行(近 340 GB)的数据文件加载到 2 个 oracle 表中,基于一些使用 Sql Loader 的条件。但是在加载了 42
我将 CSS 模块与 webpack css-loader 一起使用,然后将它们与 mini-css-extract-plugin 捆绑在一起。 这是我的配置的样子: { test: /\.c
我是一名优秀的程序员,十分优秀!