Why does running a script via Module mode require importing bge?
Because the import statement is the proper way of writing Python code.
The auto-import within script mode is a dirty shortcut. It is still there for backward compatibility. But it is no good design.
Pro
- You always need it to access the the BGE context anyway.
(In module mode you do not really need it as you can get access via function arguments.)
- Bge is not a real Python module. It is a wrapper around the BGE native code.
Contra
- It violates the Python convention to show where objects are coming from (defined by the code or imported from other modules)
- It hides the fact that this module is imported at all. So a reader will never see an explicit assignment to bge.
- The bge module should behave like regular Python modules, so it should be imported as any other Python module too.
I strongly suggest to add the import statement in script mode too and ignore the auto-import.
I hope it helps