2016-07-23 75 views
0

我知道我可以很容易地导入文件,但我正在尝试制作某种插件结构。我希望能够扫描一个文件夹并加载每个Javascript文件。我如何使用Gjs Gnome包含文件Javascript

使用Seed JS我可以使用Seed.include()来评估一个文件,就好像它包含在文件中的include被调用的点一样。 (reference

Gnome Javascript(Gjs)具有相同的功能吗?

回答

0

您可以将文件内容加载到一个字符串中,然后使用eval()来获得相同的效果。

你有一个特别的原因,你为什么不能使用导入来获得你想要的插件结构?您还可以扫描目录并导入每个JS文件。这将阻止插件将任意值转储到您的全局名称空间中。

+0

谢谢!我没有意识到你实际上可以扫描一个目录并导入每个JS文件。你提供这方面的参考吗?干杯! – user2627202

+0

可悲的是没有这方面的文档,你只能从源代码中找到。 – ptomato

1

关于这个问题有一个thread,这家伙显然抱怨说,它实际上并没有工作。我不知道它是否值得尝试,因为无论如何这种方法很糟糕 - 在我看来这太麻烦了。

因此,我将分享我在gnome扩展中所做的工作。

TL; DR:使用Node + Webpack可以获得很好的模块系统并可以访问庞大的模块库。

  • 首先,我安装了Node + npm,因为它们一起给你提供了非常有能力的模块系统。奖金 - 如果不使用任何Node API,您可以使用公共NPM模块。
  • 我创建package.json文件,那就是:
{ 
    "name": "blah", 
    "version": "0.0.1", 
    "description": "blah", 
    "scripts": { 
    "watch": "nodemon --exec 'npm run build'", 
    "build": "webpack" 
    }, 
    "author": "me", 
    "license": "ISC", 
    "devDependencies": { 
    "nodemon": "^1.11.0", 
    "webpack": "^2.2.1" 
    }, 
    "dependencies": { 
    "string-format": "^0.5.0" 
    } 
} 
  • 接下来,我已经建立了我webpack.config.js文件:
var path = require('path'); 

module.exports = { 
    entry: { 
     main: './src/main.js', 
     ui: './src/ui.js' 
    }, 
    output: { 
    filename: '[name].js', 
    path: path.resolve(__dirname), 
     libraryTarget: 'var', 
     library: '[name]' 
    }, 
    resolve: { 
     modules: [ 
      path.resolve('./src'), 
      'node_modules' 
     ] 
    }, 
    externals: { 
     'gnome': 'global', 
     'lang': 'imports.lang', 
     'gi/meta': 'imports.gi.Meta', 
     'gi/shell': 'imports.gi.Shell', 
     'ui/main': 'imports.ui.main', 
     'ui/popupMenu': 'imports.ui.popupMenu', 
     'ui/panelMenu': 'imports.ui.panelMenu', 
     'gi/atk': 'imports.gi.Atk', 
     'gi/st': 'imports.gi.St', 
     'gi/gtk': 'imports.gi.Gtk', 
     'gi/gdk': 'imports.gi.Gdk', 
     'gi/gobject': 'imports.gi.GObject', 
     'gi/gio': 'imports.gi.Gio', 
     'gi/soup': 'imports.gi.Soup', 
     'gi/glib': 'imports.gi.GLib', 
     'gi/clutter': 'imports.gi.Clutter', 
     'misc/config': 'imports.misc.config', 
     'me': 'imports.misc.extensionUtils.getCurrentExtension()' 
    } 
}; 

所以现在我得到使用节点的模块系统,我可以只需要我的东西进入文件。然后我运行npm run build和webpack给了我一个很好的紧密文件,我可以运行所有内部所需的东西。

有一个例子文件的:

const Lang = require('lang') 
const Gdk = require('gi/gdk') 

const parser = require('./parser') 
const modifier = require('./modifier') 

const rules = [ 
    parser((state, result) => { 
     const name = result.string 
     const rule = new RegExp('^[a-zA-Z0-9]+$') 
     return name && rule.test(name) 
    }, '', true), 
    modifier(Gdk.ModifierType.SUPER_MASK, 'super', false), 
    modifier(Gdk.ModifierType.MOD1_MASK, 'alt', false), 
    modifier(Gdk.ModifierType.CONTROL_MASK, 'control', false), 
    // this makes sure that we have at least one modifier enabled 
    modifier(Gdk.ModifierType.MODIFIER_MASK, false, true) 
] 

module.exports = function(state, keyval) { 
    const result = { 
     valid: false, 
     string: '', 
    } 

    if(state[0] && keyval[0]) { 
     result.valid = true, 
     result.string = Gdk.keyval_name(keyval[1]) 

     rules.forEach((rule) => { 
      result = rule(state[1], result) 
     }) 
    } 

    return result 
} 
0

您可以将新条目添加到imports.searchPath

$ mkdir -p ~/gjs/dynmodules/ 
$ touch ~/gjs/dynmodules/hello.js 

imports.searchPath.push("/home/ole/gjs") 
hello = imports.dynmodules.hello; 
相关问题