【发布时间】:2015-10-16 09:30:27
【问题描述】:
tldr:我可以 require 一切使应用程序运行,但如果我在测试中 require 模块(在应用程序中 - 请参阅下面的目录结构)文件,整个依赖链就中断了。
我在require-ing 下面的 app/test 目录(在我的 webpack React.js 应用程序中)的组件中遇到了一些困难,我在 require 的任何其他文件中没有任何困难 /app文件夹。这是目录结构
app
/components/checkout.jsx
/components/button.jsx
/test/test.js
index.jsx
dist
node_modules
webpack.config.js
package.json
在我的 webpack.config.js 中,我设置为像这样将 jsx-loader 用于我的 React 应用程序
entry: {
app: "./app/index"
},
module: {
loaders: [
{
test: /\.jsx$/,
loader: 'jsx-loader?insertPragma=React.DOM&harmony',
}
]
},
resolve: {
extensions: ['', '.js', '.jsx']
}
这允许我要求以扩展名 .jsx 结尾的文件。例如,在/app/index.jsx 我需要/app/components/checkout.jsx 做
var Checkout = require('./components/Checkout')
在/app/components/checkout.jsx 内部,我需要按钮
var Button = require('./components/Button')
所以当我需要 index.jsx 中的 Checkout 时,它会毫无问题地处理 Button 的需要。
但是,我从 app/test/test.js 开始
var Checkout = require('../components/Checkout')
并且 webpack 找不到 Checkout 组件。当我在 webpack 开发服务器中查看测试时,它没有显示 .jsx 文件扩展名已被查找。它搜索了
app/components/Checkout
app/components/Checkout.webpack.js
app/components/Checkout.web.js
app/components/Checkout.js
app/components/Checkout.json
因此,我尝试像这样使用jsx-loaderinline
var Checkout = require(jsx-loader!'../components/Checkout')
从 test 目录中,webpack 现在可以找到该文件,但它会抛出一个错误,说它无法解析 Checkout requires 的 Button。换句话说,当我在app/test 文件夹中使用require 时,整个依赖链会不同步。
如何更改我的 webpack.config.js 以便能够在具有此目录结构的测试中要求应用程序文件,或者更一般地说,如何配置 webpack 以在测试中要求应用程序文件?
更新
项目结构
/app
/test/test.js
/index.jsx
/components/checkout.jsx (and button.jsx)
/dist
/node_modules
package.json
webpack.config.js
整个 webpack 配置
var webpack = require('webpack');
module.exports = {
context: __dirname + "/app",
entry: {
vendors: ["d3", "jquery"],
app: "index"
// app: "./app/index"
},
output: {
path: './dist',
filename: 'bundle.js', //this is the default name, so you can skip it
//at this directory our bundle file will be available
//make sure port 8090 is used when launching webpack-dev-server
publicPath: 'http://localhost:8090/assets/'
},
externals: {
//don't bundle the 'react' npm package with our bundle.js
//but get it from a global 'React' variable
'react': 'React'
// 'd3': 'd3'
},
resolve: {
modulesDirectories: ['app', 'node_modules'],
extensions: ['', '.js', '.jsx'],
resolveLoader: { fallback: __dirname + "/node_modules" },
root: ['/app', '/test']
},
module: {
loaders: [
{
test: /\.jsx$/,
loader: 'jsx-loader?insertPragma=React.DOM&harmony',
}
]
},
plugins: [
// definePlugin,
new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js')
]
}
【问题讨论】:
-
你是如何设置 webpack 配置来运行测试的,它是相同的还是与 main 不同的?在我的设置中,我使用 2 个不同的配置来运行开发构建和反应测试。类似问题的解决方法是在 webpack 中添加 resolve: { extensions: ['', '.js', '.jsx'] } 以运行测试。
-
@EugeneSafronov 现在我在项目的顶层只有一个 webpack 配置。我将它的副本放在 OP 的更新部分,以及有关项目结构的更多详细信息。我考虑过使用第二个配置进行测试,但不知道该放在哪里或如何配置它。你能提供一些相关信息吗?
-
您的加载程序中没有缺少
include: __dirname吗?也可以试试:/\.jsx?$/ -
@knowbody 这些建议都不能解决问题。
-
@Leahcim 我会在我的笔记本电脑上查看它