Requirejs 回调在代码拆分时未定义
Requirejs callback undefined on code splitting
我是 RequireJS 的新手 我有一个以 index.jsx
作为入口点的 ReactJS 应用程序
// index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
export function callBackForRequirejs() {
return "testing";
}
当我通过 RequireJS 加载我的构建时,我得到这些回调
require(["/path/to/bundle"], function(callback) {
console.log(callback) // I get "callBackForRequirejs"
}, function(err){
console.log(err)
});
但是当我进行代码拆分时,我在回调中变得未定义,对于代码拆分,我正在使用这些配置
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\/]node_modules[\/]/,
name: "vendor",
chunks: "initial",
}
}
}
}
更新:
实际上,我的react app是一些外部app的插件,外部app通过RequireJS加载我的插件。外部应用程序中的代码是这样的
案例 1:
require(['/pathof/my/react/plugin/bundle.js'],
function(callbackwhenpluginloads){
callbackwhenpluginloads()
})
由于我的 bundle.js 非常大,所以我决定将它分成两部分,一部分来自 node_modules
,另一部分来自 my code
现在外部插件加载我的反应插件是这样的
案例 2:
require(['/pathof/my/react/plugin/bundle.js',
'/pathof/my/react/plugin/vendor.js' ], function(callbackwhenpluginloads){
callbackwhenpluginloads() // callbackwhenpluginloads is undefined
})
当外部应用程序在
中加载我的插件时,我收到 undefined
回调
看来,对于代码拆分,您正在使用 webpack。 webpack 和 require js 不太合得来。
你应该试试 vanilla JS。
<script onload="handleOnLoad()" />
或者使用 npm 包。
react-load-script - npm
实际上,基于 RequireJS docs 开始你做了以下方式并且效果很好:
require(['/path/to/bundle.js'], function(callback) {
console.log(callback) // you get callbackForRequireJS
}, function(error) {
console.log(error)
});
现在您对项目进行了代码拆分,因此您应该考虑 vendor.js
就像拆分 bundle.js
文件的依赖项。所以你应该先按照 this example 加载依赖项,然后 运行 其他拆分代码。所以你的代码如下所示:
requirejs.config({
paths: {
reactApp: 'path/to/bundle.js'
},
deps: ['path/to/vendor.js'],
});
require(['reactApp'], function(callback) {
console.log(callback) // it should works now
}, function(error) {
console.log(error)
});
或者还有一种我不推荐的方式:
require(['path/to/vendor.js'], function() {
require(['path/to/bundle.js'], function(callback) {
console.log(callback) // it should works now
}, function(bundleError) {
console.log('bundleError', bundleError)
});
}, function(vendorError) {
console.log('vendorError', vendorError)
});
我是 RequireJS 的新手 我有一个以 index.jsx
作为入口点的 ReactJS 应用程序
// index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
export function callBackForRequirejs() {
return "testing";
}
当我通过 RequireJS 加载我的构建时,我得到这些回调
require(["/path/to/bundle"], function(callback) {
console.log(callback) // I get "callBackForRequirejs"
}, function(err){
console.log(err)
});
但是当我进行代码拆分时,我在回调中变得未定义,对于代码拆分,我正在使用这些配置
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\/]node_modules[\/]/,
name: "vendor",
chunks: "initial",
}
}
}
}
更新:
实际上,我的react app是一些外部app的插件,外部app通过RequireJS加载我的插件。外部应用程序中的代码是这样的
案例 1:
require(['/pathof/my/react/plugin/bundle.js'],
function(callbackwhenpluginloads){
callbackwhenpluginloads()
})
由于我的 bundle.js 非常大,所以我决定将它分成两部分,一部分来自 node_modules
,另一部分来自 my code
现在外部插件加载我的反应插件是这样的
案例 2:
require(['/pathof/my/react/plugin/bundle.js',
'/pathof/my/react/plugin/vendor.js' ], function(callbackwhenpluginloads){
callbackwhenpluginloads() // callbackwhenpluginloads is undefined
})
当外部应用程序在
中加载我的插件时,我收到undefined
回调
看来,对于代码拆分,您正在使用 webpack。 webpack 和 require js 不太合得来。
你应该试试 vanilla JS。
<script onload="handleOnLoad()" />
或者使用 npm 包。 react-load-script - npm
实际上,基于 RequireJS docs 开始你做了以下方式并且效果很好:
require(['/path/to/bundle.js'], function(callback) {
console.log(callback) // you get callbackForRequireJS
}, function(error) {
console.log(error)
});
现在您对项目进行了代码拆分,因此您应该考虑 vendor.js
就像拆分 bundle.js
文件的依赖项。所以你应该先按照 this example 加载依赖项,然后 运行 其他拆分代码。所以你的代码如下所示:
requirejs.config({
paths: {
reactApp: 'path/to/bundle.js'
},
deps: ['path/to/vendor.js'],
});
require(['reactApp'], function(callback) {
console.log(callback) // it should works now
}, function(error) {
console.log(error)
});
或者还有一种我不推荐的方式:
require(['path/to/vendor.js'], function() {
require(['path/to/bundle.js'], function(callback) {
console.log(callback) // it should works now
}, function(bundleError) {
console.log('bundleError', bundleError)
});
}, function(vendorError) {
console.log('vendorError', vendorError)
});