项目之间的 Javascript IIFE 代码共享
Posted
技术标签:
【中文标题】项目之间的 Javascript IIFE 代码共享【英文标题】:Javascript IIFE code sharing between projects 【发布时间】:2017-01-15 17:24:32 【问题描述】:请寻找纯 javascript 的答案。
将 IIFE 用于 JavaScript 游戏。实际上多个网页上的多个游戏。假设所有这些游戏都需要使用一段通用代码。比如说,一个骰子; 1d20、3d6 等
这样做的正确方法是什么? IIFE 是否应该全部设置为具有唯一名称的全局变量?我担心设置为全局(也许我太担心了)。
骰子游戏是否需要传入 IIFE 游戏?如何正确执行此操作?
【问题讨论】:
在 2016 年,我认为您应该使用npm
或 bower
之类的东西,将您的源代码打包到一个可测试的小模块中,然后在您的主项目中声明您的依赖项。那么你应该使用browserify
或webpack
之类的东西将你的模块包含在你的代码中,var diceRoller = require('diceRoller');
或ES6中import diceRoller from 'diceRoller'
我不想为 npm 上的私人服务付费。我不使用凉亭。另外,不需要节点的一部分吗?我没有使用节点。只是 javascript 和简单的 html 文件。
您可以使用私有 npm,因为它接受任何 git repository as dependency。将您的代码打包成小块是模块的用途(您可以使用commonjs,即通过require.js
或browserify
使用require
的npm 样式...,amd 或带有import
的新ES6 东西) 你的浏览器中就会有模块!
【参考方案1】:
我认为你想要一个显示模块模式,而不是 IIFE 模式。
//Revealing Module Pattern (Public & Private) w Public Namespace 'game'
var game = (function()
// object to expose as public properties and methods such as game.roll
var pub = ;
//game.roll
pub.roll = function ()
//do your thing
return randomIntFromInterval(1,6);
;
function randomIntFromInterval(min,max)
return Math.floor(Math.random()*(max-min+1)+min);
//API
return pub;
());
【讨论】:
好的,所以我应该使用 setter 来传入 diceRoller。 diceRoller 不仅仅是一个 RNG,它还具有辅助功能。你的方法可能是我应该这样做的方式。谢谢。Revealing Module Pattern, not an IIFE Pattern
这是错误的,因为您演示的那个模块是一个 IIFE。唯一认为 IIFE 是 i立即 invoked function** e 表达式,所以一般来说这个(function())()
是一个IIFE。它与显示模块(或模块模式中的任何其他排列)并没有完全不同,实际上它们都利用了它,因为 IIFE 提供了它们作为基础所需的隔离级别,然后在此基础上构建。
“[模块] 模式与立即调用的函数表达式非常相似(IIFE - 有关此内容的更多信息,请参见命名空间模式部分),只是返回的是对象而不是函数。” Learning JavaScript Design Patterns by Addy Osmani以上是关于项目之间的 Javascript IIFE 代码共享的主要内容,如果未能解决你的问题,请参考以下文章