简单写了个在前端也像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;

https://github.com/lb1104/require


12 回复

简单写了个在前端也像Nodejs一样用require

在前端JavaScript中,我们通常使用importrequire来引入模块。虽然浏览器本身并不支持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();
});

解释

  1. 模块定义:我们在sms.jsmsg.jssend.js 中定义了导出函数和变量。
  2. require模拟require 函数通过动态导入(import())来加载模块,并返回一个Promise。
  3. 使用require:在main.js中,我们通过调用require并传入模块名来加载模块,并使用.then()方法处理异步加载的结果。

这种方法使得我们在前端也可以像Node.js一样使用require来组织和管理代码,从而提高代码的可维护性和复用性。


只是前端一些写法,前端主要是操作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>

解释

  1. 模块定义:每个模块(如sms.js, msg.js, send.js)都使用了ES6模块语法(exportimport)来导出和导入功能。
  2. 自定义requirecustomRequire函数接收一个模块名作为参数,并使用import()动态导入模块。
  3. 动态导入import()函数返回一个Promise,当模块加载完成后,可以通过.then()访问模块导出的内容。
  4. 使用模块:在HTML文档中,通过调用customRequire并传递相应的模块名来加载和使用模块。

这种方法可以让你在前端更灵活地管理和使用模块,尽管它与Node.js的原生require有所不同。

回到顶部