也许我正在尝试做一些愚蠢的事情,但我有一个Web应用程序(Angular2 +),我正在尝试以可扩展/模块化的方式构建它。特别是,由于缺乏更好的术语,我有各种各样的模块,我希望能够包括或不包括,具体取决于所需的部署类型。这些模块包括通过扩展基类实现的各种功能。
为简化起见,假设有一个GenericModuleDefinition
类,并且有两个模块 - ModuleOne.js
和ModuleTwo.js
。第一个定义ModuleOneDefinitionClass
并实例化导出的实例ModuleOneDefinition
,然后将其注册到ModuleRegistry
。第二个模块做了类似的事情。
(要清楚 - 当ModuleXXXDefinition
文件运行时,它会将ModuleRegistry
对象注册到ModuleXXX.js
(例如,由于某些其他.js文件导入其中一个导出)。如果它没有运行,那么显然什么都没有注册 - 这就是我遇到的问题,正如我在下面所描述的那样。)
ModuleRegistry
有一些方法可以迭代所有模块并调用它们各自的方法。在此示例中,可能有一个名为ModuleRegistry.initAllModules()
的方法,然后在每个已注册的模块上调用initModule()
方法。
启动时,我的应用程序(例如,在index.js
中)调用ModuleRegistry.initAllModules()
。显然,因为index.js导入导出的ModuleRegistry
符号,这将导致ModuleRegistry.js
代码被拉入,但由于没有显式引用两个Module .js文件中的任何一个的导出,这些文件不会被提取,因此ModuleOneDefinition
和ModuleTwoDefinition
对象不会被ModuleRegistry
实例化并注册 - 因此对initAllModules()
的调用将是没有。
显然,我可以对我ModuleDefinition
中的每个index.js
对象进行无意义的引用,这会强制它们被拉入,以便在我调用时initAllModules()
注册它们。 1}}。但这需要更改index.js
文件,具体取决于我是否要使用ModuleTwo或不使用ModuleTwo进行部署。我希望只有ModuleTwo.js
的存在足以导致文件被提取,结果ModuleTwoDefinition
才能注册ModuleRegistry
。
有没有一种标准的方法来处理这种情况?我不得不编辑一些全局文件(index.js
或它引用的其他文件),以便它有关于所有包含的模块的信息,以便它可以去加载它们?或者是否有一种聪明的方法可以让JavaScript执行目录中的所有.js文件,这样只需复制文件就足以让它们在启动时加载?
答案 0 :(得分:4)
一种聪明的方法,可以使xx JavaScript xx Node.js执行目录中的所有.js文件:
var fs = require('fs') // node filesystem
var path = require('path') // node path
function hasJsExtension(item) {
return item != 'index.js' && path.extname(item) === '.js'
}
function pathHere(item) {
return path.join('.', item)
}
fs.readdir('./', function(err, list) {
if (err) return err
list.filter(hasJsExtension).map(pathHere).forEach(require) // require them all
})
Angular非常不同,如果是服务员检查你的应用是否需要一个模块,如果是这样,那么在任何需要的时候服务相应的js文件,而不是在第一次加载时。
实际上你的情况让我想起了带有头文件声明的C ++和带有实现的cpp文件,也许你只需要在initAllModules之前使用一个defineAllModules函数。
另一种方法可能是考虑找出如何从ng-serve中排除这些模块,并将它们作为HTML中的脚本包含在其他模式之前,它们将被定义(如果存在,因此,服务),并通过angular调用如果需要,唯一的问题是控制台中的错误,如果没有提取一个脚本标记,但是你的应用程序无论如何都会工作,如果它应该这样做。
但无论如何,它将声明 /在ng-serve和HTML中的某个地方定义这些模块。
在您自己的特殊情况中,并且不愿意低估ng-serve,但是您的应用的总js是否太重而无法立即投放? (缩小和所有...),因为 good-to-go 解决方案可能是从dev js文件夹中随意构建和重建生产all.js的众多工具之一,或者就像你说的那样,你的文件夹中有拖放。
此类工具同样是服务器端,但即使你只能推送/ FTP你的javascript,你也可以在你喜欢的开发环境中使用它,只需推送你的新版本。要查看此类工具的列表,请访问Google YourDevEnvironment 捆绑 javascript'。
答案 1 :(得分:3)
要使用角度服务并在特定条件下附加静态js文件,您应该使用from urllib.request import urlopen as Req
from bs4 import BeautifulSoup as souce
start_url='https://www.ebay.de/sch/i.html?_fosrp=1&_from=R40&_nkw=iphone&_in_kw=1&_ex_kw=&_sacat=0&_mPrRngCbx=1&_udlo=600&_udhi=4.800&LH_BIN=1&LH_ItemCondition=4&_ftrt=901&_ftrv=1&_sabdlo=&_sabdhi=&_samilow=&_samihi=&_sadis=10&_fpos=&LH_SubLocation=1&_sargn=-1%26saslc%3D0&_fsradio2=%26LH_LocatedIn%3D1&_salic=77&_saact=77&LH_SALE_CURRENCY=0&_sop=2&_dmd=1&_ipg=200'
page_urls =[start_url]
for purl in page_urls:
Client=Req(purl)
page_html=Client.read()
Client.close()
page_soup=souce(page_html, "html.parser")
containers_listings = page_soup.findAll("li",{"class":"sresult lvresult clearfix li"})
container_next=page_soup.find("td",{"class":"pagn-next"})
next_url=container_next.a["href"]
#this is where you would add your new link
if next_url not in page_urls:
page_urls.append(next_url)
filename="scrape_ebay.csv"
f=open(filename,"w")
headers="item_title,item_link,item_price\n"
f.write(headers)
for container in containers_listings:
item_title=container.h3.text.strip()
item_link=container.h3.a["href"].strip()
item_price=container.span.text.strip()
f.write(item_title + "," + item_link + "," + item_price.replace(",",".") + "\n")
f.close()
,因此我在这里看到的第一个选项是弹出您的webpack配置,之后您可以指定应加载的角度
话虽如此,我会举一个例子:
使用webpack
和angular cli
您要包含的任何外部JavaScript文件,您必须将它们放在ng serve
文件中的scripts
数组中。但是您无法控制应该包含哪个文件,哪个不包含。
通过使用angular-cli.json
配置,您可以通过将终端中的标志传递给webpack
文件来指定所有这些内容,并在那里完成所有过程。
示例:
webpack config
然后:
var env.commandLineParamater, plugins;
if(env.commandLineParamater == 'production'){
plugins = [
new ScriptsWebpackPlugin({
"name": "scripts",
"sourceMap": true,
"filename": "scripts.bundle.js",
"scripts": [
"D:\\Tutorial\\Angular\\demo-project\\node_moduels\\bootstrap\\dist\\bootstrap.min.js",
"D:\\Tutorial\\Angular\\demo-project\\node_moduels\\jquery\\dist\\jquery.min.js"
],
"basePath": "D:\\Tutorial\\Angular\\demo-project"
}),
]}else{
plugins = [
new ScriptsWebpackPlugin({
"name": "scripts",
"sourceMap": true,
"filename": "scripts.bundle.js",
"scripts": [
"D:\\Tutorial\\Angular\\demo-project\\node_moduels\\bootstrap\\dist\\bootstrap.min.js"
],
"basePath": "D:\\Tutorial\\Angular\\demo-project"
}),
]
}
module.exports = (env) => {
"plugins": plugins,
// other webpack configuration
}
套装将在您的主应用套装之前加载,因此您可以在运行script.js
而不是npm run start
时控制加载的内容。
要弹出您的webpack配置,请使用ng-serve
。
一般来说,当你需要控制一些有角度的ng eject
工作时,你应该提取你自己的webpack配置并根据需要自定义它。