我有一个字符串,说:abc.def.ghi.jkl.myfile.mymethod
.如何动态导入mymethod
?
我是这样做的:
def get_method_from_file(full_path):
if len(full_path) == 1:
return map(__import__,[full_path[0]])[0]
return getattr(get_method_from_file(full_path[:-1]),full_path[-1])
if __name__=='__main__':
print get_method_from_file('abc.def.ghi.jkl.myfile.mymethod'.split('.'))
Run Code Online (Sandbox Code Playgroud)
我想知道是否需要导入单个模块.
编辑:我使用的是Python 2.6.5版.
我有一个可信的远程服务器,存储许多自定义Python模块.我可以通过HTTP(例如使用urllib2.urlopen
)作为text/plain 获取它们,但是我无法将获取的模块代码保存到本地硬盘.如何将代码作为完全可操作的Python模块导入,包括其全局变量和导入?
我想我必须使用某些组合exec
和imp
模块的功能,但我还是无法让它工作.
我正在尝试在 Node v10 环境中实现动态导入的基本功能。
主文件
async function main() {
try {
const moduleA = await import('./moduleA');
console.log('Inside main function...');
moduleA();
console.log(moduleA);
}
catch(err) {
console.log(err);
}
}
main();
Run Code Online (Sandbox Code Playgroud)
模块A.js
console.log('Inside global scope module A...');
function moduleA() {
console.log('Running module A function...');
}
export default moduleA;
Run Code Online (Sandbox Code Playgroud)
这是我运行时得到的结果 npx babel-node main.js
PS C:\myProject\test-module-imports> npx babel-node src/main.js
Inside global scope module A...
Inside main function...
TypeError: moduleA is not a function
at main (C:\myProject\test-module-imports\src/main.js:9:5)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
at …
Run Code Online (Sandbox Code Playgroud) 我正在使用React的最新版本(16.6)和react-router
(4.3.1)并尝试使用代码分割React.Suspense
.
虽然我的路由工作正常并且代码确实分裂成了几个动态加载的bundle,但我收到的警告是不返回一个函数,而是一个对象Route
.我的代码:
import React, { lazy, Suspense } from 'react';
import { Switch, Route, withRouter } from 'react-router-dom';
import Loading from 'common/Loading';
const Prime = lazy(() => import('modules/Prime'));
const Demo = lazy(() => import('modules/Demo'));
const App = () => (
<Suspense fallback={<Loading>Loading...</Loading>}>
<Switch>
<Route path="/" component={Prime} exact />
<Route path="/demo" component={Demo} />
</Switch>
</Suspense>
);
export default withRouter(App);
Run Code Online (Sandbox Code Playgroud)
控制台警告如下:
Warning: Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`. …
dynamic-import reactjs react-router react-router-v4 react-16
我正在制作一个设计为模块化的pygame程序.我正在使用main.py文件的pygame2exe构建一个exe,它基本上只是导入真正的主游戏并运行它.我希望的是一种将从EXE执行Python脚本的启动程序,而不是包含所有不可变文件的单个程序.
最好的方法是什么?我尝试使用imp在运行时动态导入所有模块而不是隐式导入它们,但这似乎打破了对象继承.
我已经在我的项目中成功添加了可加载反应的库来启用代码分割,我发现的唯一问题是webpack生成的块没有命名,它们被赋予整数名称.
我的反应可加载代码是
const AppRootLoadable = Loadable({
loader: () => import(/* webpackChunkName: "app" */ './App'),
loading: () => null,
render(loaded) {
const Component = loaded.default;
return <Component />;
},
});
Run Code Online (Sandbox Code Playgroud)
我已添加评论告诉webpack 3我希望这个块被命名为app.我做错了什么吗?
我正在尝试建立以下架构:一个核心 React 应用程序,它构建了一些基本功能,以及在运行时加载其他 React 组件的能力。这些额外的 React 组件可以按需加载,它们在构建核心应用程序时不可用(因此它们不能包含在核心应用程序的 bundle 中,必须单独构建)。经过一段时间的研究,我遇到了Webpack Externals,它看起来很合适。我现在使用以下 webpack.config.js 单独构建我的模块:
const path = require('path');
const fs = require('fs');
process.env.BABEL_ENV = 'production';
process.env.NODE_ENV = 'production';
const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
module.exports = {
entry: './src/MyModule.jsx',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'MyModule.js',
library: 'MyModule',
libraryTarget: 'umd'
},
externals: {
"react": "react",
"semantic-ui-react": "semantic-ui-react"
},
module: {
rules: [
{
test: /\.(js|jsx|mjs)$/,
include: resolveApp('src'),
loader: require.resolve('babel-loader'),
options: {
compact: true,
},
} …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个discord.js
Discord 机器人。现在由于某种原因,discord.js
不适用于ESM
模块(一个完全独立的问题),所以我的机器人应用程序使用CommonJS
模块。现在我的系统上有另一个名为 的项目Lib
,它有很多实用函数,我计划在几个不同的项目中使用这些函数,因此我不必重写它们。该Lib
项目使用ESM
模块。因为我不得不进口Lib
来自DiscordBot
,我用打字稿动态导入语法。现在,每当我转译我的DiscordBot
项目时,动态导入都会被转换成一些丑陋的 javascript 模块代码,而那些丑陋的模块代码最终会使用 require()。由于 require() 无法导入 ESM 模块,我的机器人最终崩溃了。
然而,我试图停止我的 ts 编译器,从我导入的 ts 文件中复制代码,Lib
然后将该代码手动粘贴到相应的 JS 文件中(并删除 TS 独有的功能,如类型注释和接口)。然后我运行了我的机器人应用程序,它运行得非常好。但我不想每次都这样做。所以这tsc
是编译的问题。我该如何解决?
我正在通过 Webpack 将 React 组件导出为库。在该库中,我有几个React.lazy()
执行动态导入的调用:
库.tsx:
import React from 'react';
const ComponentCheap = React.lazy(() => import('./ComponentCheap/index');
const ComponentExpensive = React.lazy(() => import('./ComponentExpensive/expensive');
export default function LibComponent(props) {
return (<div>
<Suspense fallback="Loading...">
(props.useExpensive ? <ComponentExpensive /> : <ComponentCheap />)
</Suspense>
</div>)
}
Run Code Online (Sandbox Code Playgroud)
该库又被React.lazy()
加载到消费应用程序中:
应用程序.tsx:
import React from 'react';
import ReactDOM from 'react-dom';
const LibComponent = React.lazy(() => import('@mystuff/library'));
ReactDOM.render((
<Suspense fallback="Loading...">
<LibComponent />
</Suspense>
), document.body);
Run Code Online (Sandbox Code Playgroud)
问题是:当 webpack 生成库包时,它正确地分割ComponentCheap
成ComponentExpensive
单独的块,正确放置在库文件中,但生成代码来加载这些块,就好像它们位于应用程序的根目录上一样:
var ComponentCheap …
Run Code Online (Sandbox Code Playgroud) 所以我一直在努力如何测试动态导入,在这种情况下,特别是在开玩笑,我在互联网上阅读了很多,但没有找到任何具体的东西,所以我考虑提出这个问题以集中一个体面的解决方案.
我在一个类中有以下方法
class MyClass {
successMethod() { ... }
errorMethod() { ... }
myMethod() {
return import('./myFile.js')
.then(() => this.successMethod())
.catch(() => this.errorMethod());
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
您如何使用 Jest 模拟此动态导入的 Success 和 Failing 承诺案例,以确保分别在解决或失败时调用每个方法(successMethod
和errorMethod
)?
我找到jest.doMock
了模拟已解决案例的帮助,但没有找到通过模拟来使动态导入失败的方法,以便catch
发现案例。
注意:这不是一个 React 应用程序,这是一个 Vanilla JS 项目。
dynamic-import ×10
javascript ×4
python ×3
reactjs ×3
webpack ×3
node.js ×2
babeljs ×1
dynamic ×1
es6-modules ×1
executable ×1
import ×1
jestjs ×1
launcher ×1
module ×1
pygame ×1
react-16 ×1
react-router ×1
tsc ×1
typescript ×1