简单写了个在前端也像Nodejs一样用require
简单写了个在前端也像Nodejs一样用require
127.0.0.1/目录下面
HMVC,前端页面仿node.js 的require写法.
require('sms').open();
require('msg').open();
require('sms/send').open();
require('sms/send').send();
require('sms').temparr;
简单写了个在前端也像Nodejs一样用require
在前端JavaScript中,我们通常使用import
或require
来引入模块。虽然浏览器本身并不支持Node.js的require
语法,但我们可以通过一些工具(如Webpack、Rollup等)来实现类似的功能。
下面是一个简单的实现,模拟Node.js中的require
功能,以便在前端页面中也能像Node.js一样使用require
。
示例代码
假设我们有一个文件结构如下:
/project-root/
/modules/
sms.js
msg.js
send.js
main.js
sms.js
文件内容如下:
// modules/sms.js
const temparr = [1, 2, 3];
export function open() {
console.log("SMS module opened");
}
export function send() {
console.log("Sending SMS...");
}
export { temparr };
msg.js
文件内容如下:
// modules/msg.js
export function open() {
console.log("Message module opened");
}
send.js
文件内容如下:
// modules/send.js
export function open() {
console.log("Send module opened");
}
export function send() {
console.log("Sending message...");
}
main.js
文件内容如下:
// main.js
function require(moduleName) {
const modules = {
'sms': import('./modules/sms.js'),
'msg': import('./modules/msg.js'),
'sms/send': import('./modules/send.js')
};
return modules[moduleName].then((module) => {
return module.default ? module.default : module;
});
}
// 使用require加载模块
require('sms').then((sms) => {
sms.open();
sms.send();
console.log(sms.temparr);
});
require('msg').then((msg) => {
msg.open();
});
require('sms/send').then((send) => {
send.open();
send.send();
});
解释
- 模块定义:我们在
sms.js
、msg.js
和send.js
中定义了导出函数和变量。 - require模拟:
require
函数通过动态导入(import()
)来加载模块,并返回一个Promise。 - 使用require:在
main.js
中,我们通过调用require
并传入模块名来加载模块,并使用.then()
方法处理异步加载的结果。
这种方法使得我们在前端也可以像Node.js一样使用require
来组织和管理代码,从而提高代码的可维护性和复用性。
stitch
只是前端一些写法,前端主要是操作DOM,并不需要与nodejs进行任何关联.
服务端还是php的HMVC独立各个模块,nodejs只是做消息转发.
这样也把各个模块的js也独立起来.通过require去调用.
开发时,不需要每次都去刷新页面,
requirejs
不同的,node.js里的require是同步的,也就是说几个require语句是顺序执行的
这个require是同步读取js文件,读完之后才执行后面的
这是用Ajax阻塞了下面的操作,看似不错,如果一个js返回的特别慢,这个性能可能就是问题了。 还有一个问题就是跨域,如果用getScript 就不能阻塞请求了。
这个只是我在一个内部项目中使用,仅内网,也只一台服务器.所以不考虑那么多,
跨越目前没有什么好的方法能同步顺序读取,只能异步.
真的要考虑那些,直接用那些现成的requestjs,seajs之类的了.
前端的跟后台最大区别就在这里,显然,ajax同步是不可取的。 如果想模拟这种写法,只能参考seaJS了 包装到 defined(function(require){ var sms = require(‘sms’); });
(function (module) { module.exports = function (a, b) { return a + b; }
if (typeof window !== 'undefined') {
this.window = module.exports;
}
})(typeof module === ‘undefined’ ? {exports: {}} : module);
我只是让require在前端js变成全局性的 呵呵
在前端使用类似于Node.js中的require
方法可以实现模块化加载,从而更好地组织和管理代码。虽然浏览器环境本身并不支持Node.js的require
,但我们可以使用一些工具或库来实现类似的功能。
这里提供一个简单的示例,展示如何在前端通过自定义函数实现类似Node.js的require
功能。此示例不依赖任何外部库,仅通过简单的JavaScript代码实现。
示例代码
假设我们有一个项目结构如下:
/project
/js
/module
sms.js
msg.js
send.js
index.html
sms.js
export function open() {
console.log("SMS Module Opened");
}
export const temparr = [1, 2, 3];
msg.js
export function open() {
console.log("Message Module Opened");
}
send.js
import { open } from './sms';
export function send() {
open();
console.log("Sending SMS...");
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Require Example</title>
<script type="module" src="./js/module/sms.js"></script>
<script type="module" src="./js/module/msg.js"></script>
<script type="module" src="./js/module/send.js"></script>
<script>
function customRequire(moduleName) {
return import(`./${moduleName}.js`);
}
customRequire('sms').then(sms => {
sms.open();
console.log(sms.temparr);
});
customRequire('msg').then(msg => {
msg.open();
});
customRequire('send').then(send => {
send.send();
});
</script>
</head>
<body>
</body>
</html>
解释
- 模块定义:每个模块(如
sms.js
,msg.js
,send.js
)都使用了ES6模块语法(export
和import
)来导出和导入功能。 - 自定义
require
:customRequire
函数接收一个模块名作为参数,并使用import()
动态导入模块。 - 动态导入:
import()
函数返回一个Promise,当模块加载完成后,可以通过.then()
访问模块导出的内容。 - 使用模块:在HTML文档中,通过调用
customRequire
并传递相应的模块名来加载和使用模块。
这种方法可以让你在前端更灵活地管理和使用模块,尽管它与Node.js的原生require
有所不同。