我有一个字符串,说: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.jsDiscord 机器人。现在由于某种原因,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