在缩小文件中使用 React-dom 和 RequireJS
Using React-dom with RequireJS in a minified file
我正在尝试通过 RequireJS 在充当独立库的缩小文件中使用 React + ReactDOM。
我已经到了可以使用 React(捆绑在缩小文件中)的地步,但是当尝试使用 ReactDOM 时,一切都崩溃了,到目前为止我发现的可能原因是在尝试加载 "require-dom" require 尝试导入文件 "react-dom" 而不是从缩小文件加载代码。 (其中实际包含react-dom)。
实际上我正在使用 grunt 来预编译所有需要的文件。这是我的 grunt requirejs 配置:
requirejs: {
build: {
options: {
baseUrl: './build/',
paths: {
'jquery': '../bower_components/jquery/dist/jquery.min',
'react': '../bower_components/react/react.min',
'react-dom': '../bower_components/react/react-dom.min'
},
include: ['main'],
out: 'dist/library.min.js',
optimize: 'uglify2'
}
}
}
Main.js如下:
define(['jquery', 'react', 'react-dom'], function($, React, ReactDOM) {
return {
react: React,
reactDOM: ReactDOM,
}
});
使用上述配置编译所有代码后,我将其包含在 html 文件中,如下所示:
<html>
<head>
<script src="../bower_components/requirejs/require.js"></script>
<script src="index.js"></script>
</head>
<body></body>
</html>
Index.js是一个requirejs文件如下:
requirejs.config({
baseUrl: 'src',
paths: {
mylib: 'lib/dist/library.min.js'
}
});
require(['mylib'], function(mylib) {
console.log(mylib);
});
我在执行上述代码时收到的错误如下:
require.js:1958 GET file:///D:/code/example/user/src/src/react-dom.js net::ERR_FILE_NOT_FOUND
req.load @ require.js:1958
load @ require.js:1682load @ require.js:832
fetch @ require.js:822check @ require.js:854
enable @ require.js:1173
enable @ require.js:1554
(anonymous function) @ require.js:1158
(anonymous function) @ require.js:134
each @ require.js:59enable @ require.js:1110
init @ require.js:786(anonymous function) @ require.js:1457
require.js:168 Uncaught Error: Script error for "react-dom"(…)
如果我删除 react-dom 一切都会顺利加载。
到目前为止,我已经尝试了几种方法,将 React 作为垫片导入,因此 react-dom 检测到全局 React var,但这两种方法都不起作用。
任何帮助将不胜感激,在此先感谢。
更新: Github repo with example code
更新 2: 在对 react-dom lib 和缩小脚本进行了一段时间的调试后,我发现 main 方法在调用之前执行"define('react-dom')" 在缩小的脚本中,因此问题解决为 "how to make the main script wait until the code that defines 'react-dom' is thoughly executed"。
似乎新版本的 React 15.4.1(昨天刚刚发布)解决了这个问题。更新您 bower.json 中的版本后重试!
我正在尝试通过 RequireJS 在充当独立库的缩小文件中使用 React + ReactDOM。
我已经到了可以使用 React(捆绑在缩小文件中)的地步,但是当尝试使用 ReactDOM 时,一切都崩溃了,到目前为止我发现的可能原因是在尝试加载 "require-dom" require 尝试导入文件 "react-dom" 而不是从缩小文件加载代码。 (其中实际包含react-dom)。
实际上我正在使用 grunt 来预编译所有需要的文件。这是我的 grunt requirejs 配置:
requirejs: {
build: {
options: {
baseUrl: './build/',
paths: {
'jquery': '../bower_components/jquery/dist/jquery.min',
'react': '../bower_components/react/react.min',
'react-dom': '../bower_components/react/react-dom.min'
},
include: ['main'],
out: 'dist/library.min.js',
optimize: 'uglify2'
}
}
}
Main.js如下:
define(['jquery', 'react', 'react-dom'], function($, React, ReactDOM) {
return {
react: React,
reactDOM: ReactDOM,
}
});
使用上述配置编译所有代码后,我将其包含在 html 文件中,如下所示:
<html>
<head>
<script src="../bower_components/requirejs/require.js"></script>
<script src="index.js"></script>
</head>
<body></body>
</html>
Index.js是一个requirejs文件如下:
requirejs.config({
baseUrl: 'src',
paths: {
mylib: 'lib/dist/library.min.js'
}
});
require(['mylib'], function(mylib) {
console.log(mylib);
});
我在执行上述代码时收到的错误如下:
require.js:1958 GET file:///D:/code/example/user/src/src/react-dom.js net::ERR_FILE_NOT_FOUND
req.load @ require.js:1958
load @ require.js:1682load @ require.js:832
fetch @ require.js:822check @ require.js:854
enable @ require.js:1173
enable @ require.js:1554
(anonymous function) @ require.js:1158
(anonymous function) @ require.js:134
each @ require.js:59enable @ require.js:1110
init @ require.js:786(anonymous function) @ require.js:1457
require.js:168 Uncaught Error: Script error for "react-dom"(…)
如果我删除 react-dom 一切都会顺利加载。
到目前为止,我已经尝试了几种方法,将 React 作为垫片导入,因此 react-dom 检测到全局 React var,但这两种方法都不起作用。
任何帮助将不胜感激,在此先感谢。
更新: Github repo with example code
更新 2: 在对 react-dom lib 和缩小脚本进行了一段时间的调试后,我发现 main 方法在调用之前执行"define('react-dom')" 在缩小的脚本中,因此问题解决为 "how to make the main script wait until the code that defines 'react-dom' is thoughly executed"。
似乎新版本的 React 15.4.1(昨天刚刚发布)解决了这个问题。更新您 bower.json 中的版本后重试!