require
让应用程序运行,但如果我从测试文件(在应用程序中-请参见下面的目录结构)中require
模块,则整个依赖链将会中断。我在我的Webpack React.js应用程序中的
app/test
目录中有一些困难,无法像从/app
文件夹中的任何其他文件那样require
-ing组件。这是目录结构: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中require Checkout
时,它可以毫无问题地处理Button的require。
然而,在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-loader
: var Checkout = require(jsx-loader!'../components/Checkout')
从测试目录开始,webpack现在可以找到该文件,但它会抛出一个错误,说它无法解析Checkout所需的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')
]
}
include: __dirname
吗?同时尝试一下:/\.jsx?$/
。 - knowbody