如何在Gjs Gnome Javascript中包含文件

3
我知道我可以很容易地导入文件,但我正在尝试创建一种插件结构。我想能够扫描文件夹并加载每个JavaScript文件。
使用Seed JS,我可以使用Seed.include()将文件评估为在调用include时包含在文件中的文件。(reference
Gnome Javascript(Gjs)是否有等效的函数?
3个回答

9

这个问题有一个帖子,该人似乎抱怨它实际上不起作用。我不知道是否值得尝试,因为无论如何,这种方法都太麻烦了,我认为。

所以我只是分享一下我在gnome扩展中做的事情。

简而言之:使用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()'
    }
};

现在我可以使用Node的模块系统,只需将我的东西require到文件中。然后运行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
}

2
您可以向imports.searchPath添加新条目:
$ mkdir -p ~/gjs/dynmodules/
$ touch ~/gjs/dynmodules/hello.js

imports.searchPath.push("/home/ole/gjs")
hello = imports.dynmodules.hello;

0

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

您是否有特定的原因不能使用导入来在插件结构中获取所需内容?您还可以扫描目录并导入每个JS文件。这将防止插件将任意值转储到全局命名空间中。


谢谢!我不知道你实际上可以扫描目录并导入每个JS文件。你能提供一个参考吗?干杯! - user2627202
很遗憾,这里没有文档,你只能从源代码中找到答案。 - ptomato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接