我知道我可以很容易地导入文件,但我正在尝试制作某种插件结构。我希望能够扫描一个文件夹并加载每个Javascript文件。我如何使用Gjs Gnome包含文件Javascript
使用Seed JS我可以使用Seed.include()来评估一个文件,就好像它包含在文件中的include被调用的点一样。 (reference)
Gnome Javascript(Gjs)具有相同的功能吗?
我知道我可以很容易地导入文件,但我正在尝试制作某种插件结构。我希望能够扫描一个文件夹并加载每个Javascript文件。我如何使用Gjs Gnome包含文件Javascript
使用Seed JS我可以使用Seed.include()来评估一个文件,就好像它包含在文件中的include被调用的点一样。 (reference)
Gnome Javascript(Gjs)具有相同的功能吗?
您可以将文件内容加载到一个字符串中,然后使用eval()
来获得相同的效果。
你有一个特别的原因,你为什么不能使用导入来获得你想要的插件结构?您还可以扫描目录并导入每个JS文件。这将阻止插件将任意值转储到您的全局名称空间中。
关于这个问题有一个thread,这家伙显然抱怨说,它实际上并没有工作。我不知道它是否值得尝试,因为无论如何这种方法很糟糕 - 在我看来这太麻烦了。
因此,我将分享我在gnome扩展中所做的工作。
TL; DR:使用Node + Webpack可以获得很好的模块系统并可以访问庞大的模块库。
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
}
您可以将新条目添加到imports.searchPath
:
$ mkdir -p ~/gjs/dynmodules/
$ touch ~/gjs/dynmodules/hello.js
imports.searchPath.push("/home/ole/gjs")
hello = imports.dynmodules.hello;
谢谢!我没有意识到你实际上可以扫描一个目录并导入每个JS文件。你提供这方面的参考吗?干杯! – user2627202
可悲的是没有这方面的文档,你只能从源代码中找到。 – ptomato