当前位置: 首页 > news >正文

泰州市住房和城乡建设局官方网站网络科技有限公司和科技有限公司的区别

泰州市住房和城乡建设局官方网站,网络科技有限公司和科技有限公司的区别,能进入各种网站的浏览器,舆情分析公司哪家的系统好在 node 环境中#xff0c;有两个内置的全局变量无需引入即可直接使用#xff0c;并且无处不见#xff0c;它们构成了 nodejs 的模块体系: module 与 require。以下是一个简单的示例const fs require(fs)const add (x, y) x ymodule.exports add虽然它们在平常使用…在 node 环境中有两个内置的全局变量无需引入即可直接使用并且无处不见它们构成了 nodejs 的模块体系: module 与 require。以下是一个简单的示例const fs require(fs)const add (x, y) x ymodule.exports add 虽然它们在平常使用中仅仅是引入与导出模块但稍稍深入便可见乾坤之大。在业界可用它们做一些比较 trick 的事情虽然我不大建议使用这些黑科技但稍微了解还是很有必要。如何在不重启应用时热加载模块如 require 一个 json 文件时会产生缓存但是重写文件时如何 watch如何通过不侵入代码进行打印日志循环引用会产生什么问题module wrapper当我们使用 node 中写一个模块时实际上该模块被一个函数包裹如下所示:(function(exports, require, module, __filename, __dirname) {// 所有的模块代码都被包裹在这个函数中const fs require(fs)const add (x, y) x ymodule.exports add }); 因此在一个模块中自动会注入以下变量exportsrequiremodule__filename__dirnamemodule调试最好的办法就是打印我们想知道 module 是何方神圣那就把它打印出来const fs require(fs)const add (x, y) x ymodule.exports addconsole.log(module) module.id: 如果是 . 代表是入口模块否则是模块所在的文件名可见如下的 koamodule.exports: 模块的导出module.exports 与 exports❝ module.exports 与 exports 有什么关系 ❞从以下源码中可以看到 module wrapper 的调用方 module._compile 是如何注入内置变量的因此根据源码很容易理解一个模块中的变量exports: 实际上是 module.exports 的引用require: 大多情况下是 Module.prototype.requiremodule__filename__dirname: path.dirname(__filename)// node_internals/internal/modules/cjs/loader.js:1138Module.prototype._compile function(content, filename) {// ...const dirname path.dirname(filename);const require makeRequireFunction(this, redirects);let result;// 从中可以看出exports module.exportsconst exports this.exports;const thisValue exports;const module this;if (requireDepth 0) statCache new Map();if (inspectorWrapper) {result inspectorWrapper(compiledWrapper, thisValue, exports,require, module, filename, dirname);} else {result compiledWrapper.call(thisValue, exports, require, module,filename, dirname);}// ... } require通过 node 的 REPL 控制台或者在 VSCode 中输出 require 进行调试可以发现 require 是一个极其复杂的对象从以上 module wrapper 的源码中也可以看出 require 由 makeRequireFunction 函数生成如下// node_internals/internal/modules/cjs/helpers.js:33function makeRequireFunction(mod, redirects) {const Module mod.constructor;let require;if (redirects) {// ...} else {// require 实际上是 Module.prototype.requirerequire function require(path) {return mod.require(path);};}function resolve(request, options) { // ... }require.resolve resolve;function paths(request) {validateString(request, request);return Module._resolveLookupPaths(request, mod);}resolve.paths paths;require.main process.mainModule;// Enable support to add extra extension types.require.extensions Module._extensions;require.cache Module._cache;return require; } ❝ 关于 require 更详细的信息可以去参考官方文档: Node API: require ❞require(id)require 函数被用作引入一个模块也是平常最常见最常用到的函数// node_internals/internal/modules/cjs/loader.js:1019Module.prototype.require function(id) {validateString(id, id);if (id ) {throw new ERR_INVALID_ARG_VALUE(id, id,must be a non-empty string);}requireDepth;try {return Module._load(id, this, /* isMain */ false);} finally {requireDepth--;} } 而 require 引入一个模块时实际上通过 Module._load 载入大致的总结如下如果 Module._cache 命中模块缓存则直接取出 module.exports加载结束如果是 NativeModule则 loadNativeModule 加载模块如 fs、http、path 等模块加载结束否则使用 Module.load 加载模块当然这个步骤也很长下一章节再细讲// node_internals/internal/modules/cjs/loader.js:879Module._load function(request, parent, isMain) {let relResolveCacheIdentifier;if (parent) {// ...}const filename Module._resolveFilename(request, parent, isMain);const cachedModule Module._cache[filename];// 如果命中缓存直接取缓存if (cachedModule ! undefined) {updateChildren(parent, cachedModule, true);return cachedModule.exports;}// 如果是 NativeModule加载它const mod loadNativeModule(filename, request);if (mod mod.canBeRequiredByUsers) return mod.exports;// Dont call updateChildren(), Module constructor already does.const module new Module(filename, parent);if (isMain) {process.mainModule module;module.id .;}Module._cache[filename] module;if (parent ! undefined) { // ... }let threw true;try {if (enableSourceMaps) {try {// 如果不是 NativeModule加载它module.load(filename);} catch (err) {rekeySourceMap(Module._cache[filename], err);throw err; /* node-do-not-add-exception-line */}} else {module.load(filename);}threw false;} finally {// ...}return module.exports; }; require.cache「当代码执行 require(lib) 时会执行 lib 模块中的内容并作为一份缓存下次引用时不再执行模块中内容」。这里的缓存指的就是 require.cache也就是上一段指的 Module._cache// node_internals/internal/modules/cjs/loader.js:899require.cache Module._cache; 这里有个小测试:❝ 有两个文件: index.js 与 utils.js。utils.js 中有一个打印操作当 index.js 引用 utils.js 多次时utils.js 中的打印操作会执行几次。代码示例如下 ❞「index.js」// index.js// 此处引用两次 require(./utils) require(./utils) 「utils.js」// utils.js console.log(被执行了一次) 「答案是只执行了一次」因此 require.cache在 index.js 末尾打印 require此时会发现一个模块缓存// index.jsrequire(./utils) require(./utils)console.log(require) 那回到本章刚开始的问题❝ 如何不重启应用热加载模块呢 ❞答「删掉 Module._cache」但同时会引发问题如这种 一行 delete require.cache 引发的内存泄漏血案所以说嘛这种黑魔法大幅修改核心代码的东西开发环境玩一玩就可以了千万不要跑到生产环境中去毕竟黑魔法是不可控的。总结模块中执行时会被 module wrapper 包裹并注入全局变量 require 及 module 等module.exports 与 exports 的关系实际上是 exports module.exportsrequire 实际上是 module.requirerequire.cache 会保证模块不会被执行多次不要使用 delete require.cache 这种黑魔法关注我❝ 本文收录于 GitHub 山月行博客: shfshanyue/blog内含我在实际工作中碰到的问题、关于业务的思考及在全栈方向上的学习前端工程化系列Node进阶系列 ❞
http://www.zqtcl.cn/news/422913/

相关文章:

  • 好网站建设公司昆明乐清网站优化推广
  • 哪些网站用天平做logo站长工具app官方下载
  • 做餐厅logo用什么软件网站手机自适应网站源码
  • 股票网站模板辽宁工程建设信息网站
  • 毕业设计某网站开发的开题报告范文广西建设教育网站
  • 浏览小城镇建设的网站商丘网站公司
  • python学习网站做好网络推广的技巧
  • 网站有几种类型小说网站开发源码
  • 给城市建设提议献策的网站网站建设可研报告
  • 常德论坛网站陕西建设官方网站
  • 怎么做网站访问量上海网站排名提升
  • 新乡企业网站建设胶州做网站公司
  • 网站后台权限分配说明什么网站是做家教的
  • 网站备案 空间备案 域名备案网站制作与管理技术标准实训教程
  • 东莞免费企业网站模板推广有没有专门做线下活动的网站
  • 驾校网站制作郑州手机网站建设多少钱
  • c2c网站建设策划书怎么看网站关键词密度
  • 网站在线支付方案网站建设 sam大叔排名三天上首页
  • 温岭新站seo网站免费进入窗口软件有哪些
  • 网站未备案什么意思网站 php .net
  • 网站开发第三方登录设计七牛图床 wordpress
  • 大连网站设计案例宁波品牌网站设计价格
  • 响应式表白网站源码黑龙江建设网电话
  • wordpress企业建站生产企业做网站的费用怎么做账
  • 天都城网站建设wordpress pluings
  • 惠州做网站的公司有哪些wordpress主动推送
  • jsp做的网站带数据库新手网站设计定价
  • 做网站公司需要什么条件不锈钢公司网站源码 网站建设 产品3级分类asp源码
  • 经营网站挣钱网络运维工程师证书怎么考
  • 厦门网站建设ui株洲企业网站制作