Browse Source

fix

tags/v0.9.1
郑荣升 5 years ago
parent
commit
f30ec956b1
  1. 12
      .idea/go-service-template.iml
  2. 8
      .idea/modules.xml
  3. 6
      .idea/vcs.xml
  4. 576
      .idea/workspace.xml
  5. 294
      govue/bindata.go
  6. 25
      govue/cmd/main.go
  7. 25
      govue/govue-js-src/build.js
  8. 54196
      govue/govue-js-src/dist/index.js
  9. 38
      govue/govue-js-src/package.json
  10. 12
      govue/govue-js-src/predo.js
  11. 9
      govue/govue-js-src/replace.tp
  12. 1
      govue/govue-js-src/replace2.tp
  13. 74
      govue/govue-js-src/src/browser.js
  14. 53
      govue/govue-js-src/src/goruntime.js
  15. 8
      govue/govue-js-src/src/index.js
  16. 47
      govue/govue-js-src/test.js
  17. 54196
      govue/govue-runtime/govue.js
  18. 12
      govue/govue-runtime/header.js
  19. 110
      govue/govue-runtime/runtime.js
  20. 85
      govue/govue.go
  21. 87
      jsruntime/runtime.go
  22. 33
      jsruntime/timeout.go
  23. 45
      pool/pool.go
  24. 18
      static/css/main.css
  25. 33
      static/index.html
  26. 6
      static/index.js
  27. 6
      static/js/vue.min.js
  28. 40
      static/use.js

12
.idea/go-service-template.iml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/govue-js-src" />
<excludeFolder url="file://$MODULE_DIR$/govue/govue-js-src" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/go-service-template.iml" filepath="$PROJECT_DIR$/.idea/go-service-template.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

576
.idea/workspace.xml

@ -0,0 +1,576 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="28e09409-bf4a-4792-a1b4-fc9301162fe5" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/govue/govue-runtime/runtime.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/static/css/main.css" afterDir="false" />
<change afterPath="$PROJECT_DIR$/static/index.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/static/js/vue.min.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/govue-runtime/request.js" beforeDir="false" afterPath="$PROJECT_DIR$/govue/govue-runtime/header.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/govue/govue.go" beforeDir="false" afterPath="$PROJECT_DIR$/govue/govue.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jsruntime/runtime.go" beforeDir="false" afterPath="$PROJECT_DIR$/jsruntime/runtime.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/jsruntime/timeout.go" beforeDir="false" afterPath="$PROJECT_DIR$/jsruntime/timeout.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.go" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/pool/pool.go" beforeDir="false" afterPath="$PROJECT_DIR$/pool/pool.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/static/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/static/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/static/use.js" beforeDir="false" afterPath="$PROJECT_DIR$/static/use.js" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/static/use.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="28" column="3" selection-start-line="28" selection-start-column="3" selection-end-line="28" selection-end-column="3" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/govue/govue.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="38">
<caret line="2" column="50" selection-start-line="2" selection-start-column="2" selection-end-line="2" selection-end-column="50" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/static/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="266">
<caret line="14" column="6" lean-forward="true" selection-start-line="14" selection-start-column="6" selection-end-line="14" selection-end-column="6" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/static/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="57">
<caret line="3" column="38" selection-start-line="3" selection-start-column="38" selection-end-line="3" selection-end-column="38" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/static/js/vue.min.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
<caret line="5" column="48" selection-start-line="5" selection-start-column="48" selection-end-line="5" selection-end-column="48" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/govue/cmd/main.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="760">
<caret line="48" column="14" selection-start-line="48" selection-start-column="14" selection-end-line="48" selection-end-column="14" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/runtime.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
<caret line="16" column="52" selection-start-line="16" selection-start-column="47" selection-end-line="16" selection-end-column="52" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja/parser/parser.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2356">
<caret line="133" column="46" selection-start-line="133" selection-start-column="38" selection-end-line="133" selection-end-column="46" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/header.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="13" column="45" selection-start-line="13" selection-start-column="45" selection-end-line="13" selection-end-column="45" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/govue.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="25170" column="2" selection-start-line="25170" selection-start-column="2" selection-end-line="25170" selection-end-column="2" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Go File" />
<option value="JavaScript File" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>GoVueRequest</find>
<find>GoVueUse</find>
<find>暂不使用setTimeout</find>
<find>url.String()</find>
<find>loop.jobCount&quot;</find>
<find>loop.jobCount--</find>
<find>jobCount</find>
<find>Url</find>
<find>vue</find>
<find>jobCount--</find>
<find>GoUseRegisteredCall</find>
<find>GoUseCall</find>
<find>console</find>
<find>GoQuery</find>
<find>路由未找到</find>
<find>query</find>
<find>GoParam</find>
<find>RunString</find>
<find>Runs</find>
<find>timeo</find>
<find>dist</find>
<find>CreateFile</find>
<find>NotYetImplemented</find>
<find>v_ignore_class</find>
</findStrings>
</component>
<component name="GOROOT" path="C:\Go" />
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/govue-runtime/XMLHttpRequest.js" />
<option value="$PROJECT_DIR$/eventloop/eventloop.go" />
<option value="$PROJECT_DIR$/console/module.go" />
<option value="$PROJECT_DIR$/jsruntime/interval.go" />
<option value="$PROJECT_DIR$/jsruntime/console.go" />
<option value="$PROJECT_DIR$/jsruntime/go_request.go" />
<option value="$PROJECT_DIR$/jsruntime/use_callback.go" />
<option value="$PROJECT_DIR$/govue-runtime/runtime.js" />
<option value="$PROJECT_DIR$/jsruntime/timeout.go" />
<option value="$PROJECT_DIR$/govue-runtime/request.js" />
<option value="$PROJECT_DIR$/govue-runtime/header.js" />
<option value="$PROJECT_DIR$/../../../github.com/dop251/goja/runtime.go" />
<option value="$PROJECT_DIR$/jsruntime/runtime.go" />
<option value="$PROJECT_DIR$/main.go" />
<option value="$PROJECT_DIR$/pool/pool.go" />
<option value="$PROJECT_DIR$/govue/govue.go" />
<option value="$PROJECT_DIR$/govue/cmd/main.go" />
<option value="$PROJECT_DIR$/static/css/main.css" />
<option value="$PROJECT_DIR$/static/use.js" />
<option value="$PROJECT_DIR$/govue/govue-runtime/govue.js" />
<option value="$PROJECT_DIR$/govue/govue-runtime/runtime.js" />
<option value="$PROJECT_DIR$/static/index.html" />
<option value="$PROJECT_DIR$/static/index.js" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="187" />
<option name="y" value="141" />
<option name="width" value="1710" />
<option name="height" value="1220" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="govue" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="govue" type="462c0819:PsiDirectoryNode" />
<item name="cmd" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="govue" type="462c0819:PsiDirectoryNode" />
<item name="govue-runtime" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="static" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="static" type="462c0819:PsiDirectoryNode" />
<item name="css" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="go-service-template" type="b2602c69:ProjectViewProjectNode" />
<item name="go-service-template" type="462c0819:PsiDirectoryNode" />
<item name="static" type="462c0819:PsiDirectoryNode" />
<item name="js" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="DefaultGoTemplateProperty" value="Go File" />
<property name="GO_FMT" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="go.gopath.indexing.explicitly.defined" value="true" />
<property name="go.import.settings.migrated" value="true" />
<property name="go.sdk.automatically.set" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/static/js" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\static\js" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\static" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\govue\govue-runtime" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\govue-runtime" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\static\js" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\govue" />
<recent name="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager">
<configuration name="govue" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="go-service-template" />
<working_directory value="$PROJECT_DIR$/" />
<go_parameters value="-i" />
<kind value="DIRECTORY" />
<filePath value="$PROJECT_DIR$/" />
<package value="git.ouxuan.net/3136352472/go-service-template" />
<directory value="C:\Users\wailo\go\src\git.ouxuan.net\3136352472\go-service-template\govue\cmd" />
<output_directory value="$PROJECT_DIR$/" />
<method v="2" />
</configuration>
</component>
<component name="ToolWindowManager">
<frame x="150" y="113" width="1368" height="976" extended-state="0" />
<editor active="true" />
<layout>
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.40992367" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.49101797" visible="true" weight="0.41469195" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Database Changes" order="8" />
<window_info anchor="bottom" id="Version Control" order="9" sideWeight="0.499501" weight="0.32997987" />
<window_info anchor="bottom" id="Terminal" order="10" sideWeight="0.49151698" weight="0.32819906" />
<window_info anchor="bottom" id="Event Log" order="11" sideWeight="0.500499" side_tool="true" weight="0.32997987" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Database" order="3" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="fix" />
<option name="LAST_COMMIT_MESSAGE" value="fix" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja_nodejs/console/module.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="412">
<caret line="45" column="39" selection-start-line="45" selection-start-column="39" selection-end-line="45" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja/object_gomap_reflect_test.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="346">
<caret line="91" column="55" selection-start-line="91" selection-start-column="28" selection-end-line="91" selection-end-column="55" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja_nodejs/eventloop/eventloop.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="205">
<caret line="67" column="69" selection-start-line="67" selection-start-column="23" selection-end-line="67" selection-end-column="69" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/main.js" />
<entry file="file://$PROJECT_DIR$/eventloop/eventloop.go" />
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja_nodejs/require/module.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1736">
<caret line="43" column="19" selection-start-line="43" selection-start-column="19" selection-end-line="43" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/console/module.go" />
<entry file="file://$PROJECT_DIR$/../../hasaki-service/hasaki-sdk/hskhttpdo/httpdo.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="379">
<caret line="33" column="37" selection-start-line="33" selection-start-column="37" selection-end-line="33" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/gin-gonic/gin/context.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="188">
<caret line="45" column="14" selection-start-line="45" selection-start-column="14" selection-end-line="45" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://C:/Go/src/time/tick.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="169">
<caret line="10" column="20" selection-start-line="10" selection-start-column="20" selection-end-line="10" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jsruntime/use_callback.go" />
<entry file="file://$PROJECT_DIR$/jsruntime/go_request.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="494">
<caret line="29" column="9" selection-start-line="29" selection-start-column="9" selection-end-line="29" selection-end-column="9" />
<folding>
<element signature="e#19#100#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jsruntime/interval.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="228">
<caret line="12" selection-start-line="12" selection-end-line="12" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jsruntime/console.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="209">
<caret line="11" selection-start-line="11" selection-end-line="11" />
<folding>
<element signature="e#19#111#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/wailovet/android-vrc/cmd/main.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="399">
<caret line="28" column="57" selection-start-line="28" selection-start-column="57" selection-end-line="28" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/elazarl/go-bindata-assetfs/assetfs.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="327">
<caret line="132" column="43" lean-forward="true" selection-start-line="132" selection-start-column="43" selection-end-line="132" selection-end-column="43" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/bindata.go" />
<entry file="file://C:/Go/src/net/http/fs.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="224">
<caret line="716" column="5" selection-start-line="716" selection-start-column="5" selection-end-line="716" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jsruntime/timeout.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="55">
<caret line="24" column="30" selection-start-line="24" selection-start-column="30" selection-end-line="24" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://C:/Go/src/time/time.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="210">
<caret line="1163" column="24" selection-start-line="1163" selection-start-column="14" selection-end-line="1163" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue-runtime/request.js" />
<entry file="file://$PROJECT_DIR$/../../hasaki-service/hasaki-sdk/hskutils/utils.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="115">
<caret line="70" lean-forward="true" selection-start-line="70" selection-end-line="74" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/bindata.go">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/jsruntime/runtime.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3306">
<caret line="186" column="5" selection-start-line="186" selection-start-column="5" selection-end-line="186" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/main.go" />
<entry file="file://$PROJECT_DIR$/pool/pool.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1349">
<caret line="77" column="27" selection-start-line="77" selection-start-column="27" selection-end-line="77" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/jolestar/go-commons-pool/pool.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="6935">
<caret line="374" column="24" selection-start-line="374" selection-start-column="24" selection-end-line="374" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/js/modernizr-3.8.0.min.js" />
<entry file="file://$PROJECT_DIR$/static/js/main.js" />
<entry file="file://$PROJECT_DIR$/static/js/jquery-3.4.1.min.js" />
<entry file="file://$PROJECT_DIR$/static/css/normalize.css" />
<entry file="file://$PROJECT_DIR$/static/css/main.css">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="228">
<caret line="12" column="9" selection-start-line="12" selection-start-column="9" selection-end-line="12" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/jolestar/go-commons-pool/config.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1178">
<caret line="68" column="35" selection-start-line="68" selection-start-column="35" selection-end-line="68" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja/runtime.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="14934">
<caret line="802" column="36" selection-start-line="802" selection-start-column="36" selection-end-line="802" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../../github.com/dop251/goja/parser/parser.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2356">
<caret line="133" column="46" selection-start-line="133" selection-start-column="38" selection-end-line="133" selection-end-column="46" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/cmd/main.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="760">
<caret line="48" column="14" selection-start-line="48" selection-start-column="14" selection-end-line="48" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/govue.go">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="38">
<caret line="2" column="50" selection-start-line="2" selection-start-column="2" selection-end-line="2" selection-end-column="50" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/js/vue.min.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
<caret line="5" column="48" selection-start-line="5" selection-start-column="48" selection-end-line="5" selection-end-column="48" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/header.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="13" column="45" selection-start-line="13" selection-start-column="45" selection-end-line="13" selection-end-column="45" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/govue.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="156">
<caret line="25170" column="2" selection-start-line="25170" selection-start-column="2" selection-end-line="25170" selection-end-column="2" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/govue/govue-runtime/runtime.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
<caret line="16" column="52" selection-start-line="16" selection-start-column="47" selection-end-line="16" selection-end-column="52" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/use.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="28" column="3" selection-start-line="28" selection-start-column="3" selection-end-line="28" selection-end-column="3" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/index.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="57">
<caret line="3" column="38" selection-start-line="3" selection-start-column="38" selection-end-line="3" selection-end-column="38" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="266">
<caret line="14" column="6" lean-forward="true" selection-start-line="14" selection-start-column="6" selection-end-line="14" selection-end-column="6" />
</state>
</provider>
</entry>
</component>
</project>

294
govue/bindata.go
File diff suppressed because it is too large
View File

25
main.go → govue/cmd/main.go

@ -3,22 +3,25 @@ package main
import ( import (
"fmt" "fmt"
"git.ouxuan.net/3136352472/go-service-template/govue" "git.ouxuan.net/3136352472/go-service-template/govue"
"git.ouxuan.net/3136352472/go-service-template/pool"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"mime"
"path/filepath"
"runtime"
) )
func main() { func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
r := gin.Default() r := gin.Default()
govue.SetPoolConfig(pool.Config{
MinIdle: 100,
})
gv, err := govue.NewGoVueDefaultConfig() gv, err := govue.NewGoVueDefaultConfig()
if err != nil { if err != nil {
panic(err) panic(err)
} }
r.Use(func(context *gin.Context) {
context.Header("Access-Control-Allow-Origin", "*")
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
context.Header("Access-Control-Allow-Headers", "Action, Module, X-PINGOTHER, Content-Type, Content-Disposition")
})
r.NoRoute(func(context *gin.Context) { r.NoRoute(func(context *gin.Context) {
raw, err := gv.LoadStaticResources(context.Request) raw, err := gv.LoadStaticResources(context.Request)
@ -26,9 +29,17 @@ func main() {
context.Writer.Write([]byte(fmt.Sprintln("服务器错误", err.Error()))) context.Writer.Write([]byte(fmt.Sprintln("服务器错误", err.Error())))
return return
} }
mime.TypeByExtension(filepath.Ext(context.Request.URL.Path))
context.Writer.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(context.Request.URL.Path)))
context.Writer.WriteHeader(200) context.Writer.WriteHeader(200)
_, _ = context.Writer.Write(raw) _, _ = context.Writer.Write(raw)
}) })
r.Use(func(context *gin.Context) {
context.Header("Access-Control-Allow-Origin", "*")
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
context.Header("Access-Control-Allow-Headers", "Action, Module, X-PINGOTHER, Content-Type, Content-Disposition")
})
r.GET("/test", func(context *gin.Context) { r.GET("/test", func(context *gin.Context) {
context.JSON(200, map[string]interface{}{ context.JSON(200, map[string]interface{}{
"code": 0, "code": 0,
@ -39,6 +50,8 @@ func main() {
}) })
}) })
gv.StartPoolLog()
r.Run("127.0.0.1:8080") r.Run("127.0.0.1:8080")
} }

25
govue/govue-js-src/build.js

@ -0,0 +1,25 @@
var fs = require("fs");
var envify = require('envify/custom')
var browserify = require("browserify");
browserify("./src/index.js")
.transform("babelify", {
plugins: [
'@babel/preset-env',
"@babel/preset-es2015"
],
plugins: [
'@babel/plugin-transform-modules-commonjs',
'@babel/plugin-transform-object-assign',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-object-rest-spread'
]
}).transform(
// 用来处理 `node_modules` 文件
{ global: true },
envify({ NODE_ENV: 'production' })
)
.bundle()
.pipe(fs.createWriteStream("./dist/index.js"));

54196
govue/govue-js-src/dist/index.js
File diff suppressed because it is too large
View File

38
govue/govue-js-src/package.json

@ -0,0 +1,38 @@
{
"name": "govue-template",
"dependencies": {
"axios": "^0.19.2",
"axios-miniprogram-adapter": "^0.3.0",
"domino": "^2.1.5",
"envify": "^4.1.0",
"es6-promise": "^4.2.8",
"esprima": "^4.0.1",
"jquery-bbq": "^1.0.0",
"through": "^2.3.8",
"vue": "^2.6.11",
"vue-axios": "^2.1.5",
"vue-router": "^3.1.6"
},
"scripts": {
"build": "node build.js && node predo.js"
},
"browser": {
"vue": "vue/dist/vue.common.js"
},
"devDependencies": {
"@babel/core": "^7.9.6",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-object-rest-spread": "^7.9.6",
"@babel/plugin-transform-classes": "^7.9.5",
"@babel/plugin-transform-modules-commonjs": "^7.9.6",
"@babel/plugin-transform-object-assign": "^7.8.3",
"@babel/plugin-transform-property-literals": "^7.8.3",
"@babel/plugin-transform-property-mutators": "^7.8.3",
"@babel/preset-env": "^7.9.6",
"@babel/preset-es2015": "^7.0.0-beta.53",
"@babel/preset-react": "^7.9.4",
"babel-cli": "^6.26.0",
"babelify": "^10.0.0",
"browserify": "^16.5.1"
}
}

12
govue/govue-js-src/predo.js

@ -0,0 +1,12 @@
var fs = require("fs");
var retemp = fs.readFileSync("./replace.tp")
var retemp2 = fs.readFileSync("./replace2.tp")
var content = fs.readFileSync("./dist/index.js")
var test = content.toString().indexOf(retemp)
console.log(test)
content = content.toString().replace(retemp, `NodeList`).replace(retemp2, ``)
fs.writeFileSync("./dist/index.js", content)

9
govue/govue-js-src/replace.tp

@ -0,0 +1,9 @@
class NodeList extends Array {
constructor(a) {
super((a && a.length) || 0);
if (a) {
for (var idx in a) { this[idx] = a[idx]; }
}
}
item(i) { return this[i] || null; }
}

1
govue/govue-js-src/replace2.tp

@ -0,0 +1 @@
throw new Error("NotYetImplemented");

74
govue/govue-js-src/src/browser.js

@ -0,0 +1,74 @@
console.log("浏览器端")
Promise = require('es6-promise').Promise;
window.Vue = require('vue');
window.VueRouter = require('vue-router');
Vue.use(VueRouter)
window.$ = window.jQuery = require('jquery');
require('jquery-bbq');
window.axios = require('axios');
import VueAxios from 'vue-axios'
window.Vue.use(VueAxios, window.axios)
window.GoQuery = location.search;
window.GoParam = jQuery.deparam(GoQuery);
window.GoUse = function (cb) {
var path = location.pathname
if (path.indexOf(".html") < 0) {
if (path[path.length - 1] == "/" && path.length > 1) {
path = path + "index.html"
} else {
path = path + ".html"
}
}
if (cb) cb(path, location.search)
}
window.GoUseRegistered = function (id, cb) {
var govueId = "";
if (document.getElementsByTagName("html").length > 0) {
govueId = document.getElementsByTagName("html")[0].getAttribute("govue-id")
}
var path = location.pathname
if (path.indexOf(".html") < 0) {
if (path[path.length - 1] == "/" && path.length > 1) {
path = path + "index.html"
} else {
path = path + ".html"
}
}
if (govueId == id || path == id) {
if (cb) cb(location.search)
}
};
window.GoUseCall = function (e) {
// console.log("GoUseCall", 2)
var id = e["id"];
var path = e["path"];
var query = e["query"];
if (useRoute[id]) {
console.log(useRoute[id])
useRoute[id](query);
return
}
// console.log("GoUseCall", 3)
if (useRoute[path]) {
useRoute[path](query);
return
}
console.log("路由未找到:", id, "-", path)
}

53
govue/govue-js-src/src/goruntime.js

@ -0,0 +1,53 @@
domino = require('domino');
window = domino.createWindow("", "http://127.0.0.1/");
document = window.document;
location = window.location;
Promise = require('es6-promise').Promise;
Vue = require('vue');
$ = jQuery = require('jquery');
require('jquery-bbq');
axios = require('axios');
import mpAdapter from 'axios-miniprogram-adapter'
axios.defaults.adapter = mpAdapter
useRoute = {};
GoUseRegistered = function (id, cb) {
useRoute[id] = cb
};
goUseCallCache
GoUseCall = function (e) {
// console.log("GoUseCall", 1)
if (goUseCallCache) {
goUseCallCache(e)
}
// console.log("GoUseCall", 2)
var id = e["id"];
var path = e["path"];
if(!e["query"]){
console.log("query未找到");
e["query"] = {};
}
var query = e["query"];
if (useRoute[id]) {
// console.log(useRoute[id])
useRoute[id](query);
return
}
// console.log("GoUseCall", 3)
if (useRoute[path]) {
useRoute[path](query);
return
}
// console.log("路由未找到:", id, "-", path)
}
GoUse = function (cb) {
goUseCallCache = cb
}

8
govue/govue-js-src/src/index.js

@ -0,0 +1,8 @@
if (window) {
require("./browser")
} else {
require("./goruntime")
}

47
govue/govue-js-src/test.js

@ -0,0 +1,47 @@
global.domino = null
global.window = null
global.document = null
global.location = null
global.Vue = null
global.VueRouter = null
global.axios = null
navigator = null
require("./dist/index")
var html = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>Title</title>\n</head>\n<body>\n<div id=\"classifyer\">\n code : {{code}}\n <li v-for=\"todo in data\">\n classifyer_id :{{ todo.classifyer_id }}\n name :{{ todo.name }}\n </li>\n</div>\n</body>\n</html>"
window = domino.createWindow(html, "http://127.0.0.1/#/detail/?id=123");
document = window.document;
location = window.location;
var vue = new Vue({
el: "#classifyer",
data: function(){
return {
code: 212123213123,
data: [
{ name: "1asdasdasd23" }
]
}
}
});
console.log(document.innerHTML);
Vue.axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.then(function () {
// always executed
});

54196
govue/govue-runtime/govue.js
File diff suppressed because it is too large
View File

12
govue-runtime/request.js → govue/govue-runtime/header.js

@ -1,3 +1,9 @@
var domino, window, document, location, Vue, VueRouter, navigator, axios, Promise, GoUseCall, GoUse, GoUseRegistered,
govueId, useRoute, goUseCallCache, $, jQuery, GoParam;
navigator = {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
};
var wx = { var wx = {
request: function (c) { request: function (c) {
var url = c["url"]; var url = c["url"];
@ -9,8 +15,8 @@ var wx = {
var success = c["success"]; var success = c["success"];
var fail = c["fail"]; var fail = c["fail"];
var complete = c["complete"]; var complete = c["complete"];
console.log("request");
console.log(url);
// console.log("request");
// console.log(url);
var isHost = url.indexOf("http://") > -1 || url.indexOf("https://") > -1; var isHost = url.indexOf("http://") > -1 || url.indexOf("https://") > -1;
var isAbs = (url[0] == '/'); var isAbs = (url[0] == '/');
if (!isHost) { if (!isHost) {
@ -25,7 +31,7 @@ var wx = {
url = location.protocol + "//" + url url = location.protocol + "//" + url
} }
console.log("url",url);
// console.log("url",url);
var result = GoRequest({ var result = GoRequest({
url: url, url: url,
data: data, data: data,

110
govue/govue-runtime/runtime.js

@ -0,0 +1,110 @@
window = domino.createWindow(GoHtmlSrc, GoHref);
document = window.document;
location = window.location;
var govueId = "";
if (document.getElementsByTagName("html").length > 0) {
govueId = document.getElementsByTagName("html")[0].getAttribute("govue-id")
}
var jsInline = document.getElementsByTagName("script");
var jsInlineFiles = [];
for (var i = jsInline.length - 1; i >= 0; i--) {
var isGoVueSrc = jsInline[i].hasAttribute("govue-src");
if (isGoVueSrc) {
var res = {};
var file = jsInline[i].getAttribute("src");
if (jsInline[i].hasAttribute("src") && file != "") {
res["file"] = file
}
if (jsInline[i].text && jsInline[i].text != "") {
res["src"] = jsInline[i].text;
}
if (res["file"] || res["src"]) {
jsInlineFiles.unshift(res);
}
jsInline[i].remove();
}
}
try {
GoParam = jQuery.deparam(GoQuery);
var gv_ignore = document.getElementsByTagName("gv-ignore");
var gv_ignore_len = gv_ignore.length;
var gv_ignore_tag_map = {};
for (var i = gv_ignore_len - 1; i >= 0; i--) {
gv_ignore_tag_map[i] = gv_ignore[i].innerHTML;
gv_ignore[i].outerHTML = "<gv-ignore-" + i + "></gv-ignore-" + i + ">";
}
var gv_ignore_class = document.getElementsByClassName("gv-ignore");
var gv_ignore_class_len = gv_ignore_class.length;
var gv_ignore_class_map = {};
console.log("gv_ignore_class", gv_ignore_class_len);
for (var i = 0; i < gv_ignore_class_len; i++) {
if (!gv_ignore_class_map[i]) {
gv_ignore_class_map[i] = {};
}
var a = gv_ignore_class[i].attributes;
var len = gv_ignore_class[i].attributes.length;
for (var k = len - 1; k >= 0; k--) {
gv_ignore_class_map[i][a.item(k).name] = a.item(k).value;
gv_ignore_class[i].removeAttribute(a.item(k).name);
}
gv_ignore_class[i].setAttribute("class","gv-ignore-"+i)
}
for (var i in jsInlineFiles) {
if (jsInlineFiles[i]["file"]) {
GoRunCodeByFile(jsInlineFiles[i]["file"]);
}
if (jsInlineFiles[i]["src"]) {
eval(jsInlineFiles[i]["src"]);
}
}
GoUseCall({
id: govueId,
path: GoPath,
query: jQuery.deparam(GoQuery)
});
for (var i = 0; i < gv_ignore_len; i++) {
var gv_ignores = document.getElementsByTagName("gv-ignore-" + i);
for (var k = 0; k < gv_ignores.length; k++) {
gv_ignores[k].innerHTML = gv_ignore_tag_map[i];
}
}
for (var i = 0; i < gv_ignore_class_len; i++) {
var gv_ignores = document.getElementsByClassName("gv-ignore-" + i);
console.log("gv-ignore-" + i)
for (var k = 0; k < gv_ignores.length; k++) {
console.log("gv-ignore-" + i,k)
for(var j in gv_ignore_class_map[i]){
console.log("gv-ignore-" + i,k,j)
gv_ignores[k].setAttribute(j,gv_ignore_class_map[i][j]);
}
}
}
} catch (e) {
console.log("VM Uncaught:", e);
}
// console.log(document.innerHTML);
GoReturn(document.innerHTML);

85
govue/govue.go

@ -1,62 +1,118 @@
package govue package govue
//go-bindata-assetfs --pkg=govue govue-runtime/...
import ( import (
"fmt" "fmt"
"git.ouxuan.net/3136352472/go-service-template/jsruntime" "git.ouxuan.net/3136352472/go-service-template/jsruntime"
"git.ouxuan.net/3136352472/go-service-template/pool" "git.ouxuan.net/3136352472/go-service-template/pool"
"git.ouxuan.net/hasaki-service/hasaki-sdk/hskutils" "git.ouxuan.net/hasaki-service/hasaki-sdk/hskutils"
assetfs "github.com/elazarl/go-bindata-assetfs"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"time"
) )
type GoVue struct { type GoVue struct {
StaticPath string StaticPath string
UseJsPath string UseJsPath string
Resources *assetfs.AssetFS
jsRuntimePool *pool.JsRuntimePool jsRuntimePool *pool.JsRuntimePool
} }
func NewGoVueDefaultConfig() (gv *GoVue, err error) { func NewGoVueDefaultConfig() (gv *GoVue, err error) {
gv = &GoVue{}
gv = &GoVue{
Resources: assetFS(),
}
err = gv.initRender() err = gv.initRender()
return return
} }
func NewGoVue(staticPath, useJsPath string) (gv *GoVue, err error) {
func NewGoVue(useJsPath string, staticPath string) (gv *GoVue, err error) {
gv = &GoVue{ gv = &GoVue{
StaticPath: staticPath, StaticPath: staticPath,
UseJsPath: useJsPath, UseJsPath: useJsPath,
Resources: assetFS(),
} }
err = gv.initRender() err = gv.initRender()
return return
} }
func SetPoolConfig(config pool.Config) {
pool.DefaultConfig = config
}
func (gv *GoVue) initRender() (err error) { func (gv *GoVue) initRender() (err error) {
mainFile := filepath.Join(hskutils.GetSelfFilePath(), "govue-runtime", "runtime.js")
var useFileName string
if gv.StaticPath == "" {
gv.StaticPath = filepath.Join(hskutils.GetSelfFilePath(), "static")
}
if gv.UseJsPath == "" { if gv.UseJsPath == "" {
useFileName = filepath.Join(hskutils.GetSelfFilePath(), "static", "use.js")
} else {
useFileName = gv.UseJsPath
gv.UseJsPath = filepath.Join(gv.StaticPath, "use.js")
}
mainScript, err := gv.Resources.Asset(filepath.Join("govue-runtime", "runtime.js"))
if err != nil {
return
}
headerScript, err := gv.Resources.Asset(filepath.Join("govue-runtime", "header.js"))
if err != nil {
return
}
govueScript, err := gv.Resources.Asset(filepath.Join("govue-runtime", "govue.js"))
if err != nil {
return
} }
gv.jsRuntimePool = pool.NewJsRuntimePool(mainFile, useFileName, jsruntime.Relys{
//govueScript, err := ioutil.ReadFile(filepath.Join("govue-js-src", "dist", "index.js"))
//if err != nil {
// return
//}
gv.jsRuntimePool = pool.NewJsRuntimePool(string(mainScript), gv.UseJsPath, gv.StaticPath, jsruntime.Relys{
jsruntime.Rely{ jsruntime.Rely{
FileName: filepath.Join("govue-runtime", "header.js"),
Src: string(headerScript),
}, },
jsruntime.Rely{ jsruntime.Rely{
FileName: filepath.Join("govue-runtime", "request.js"),
Src: string(govueScript),
}, },
//jsruntime.Rely{ //jsruntime.Rely{
// FileName: filepath.Join("govue-runtime", "govue.js"),
// FileName: filepath.Join("govue-js-src", "dist", "index.js"),
//}, //},
jsruntime.Rely{
FileName: filepath.Join("govue-js-src", "dist", "index.js"),
},
}, jsruntime.ModeSync) }, jsruntime.ModeSync)
return return
} }
func (gv *GoVue) PoolLog() {
gv.jsRuntimePool.Log()
}
func (gv *GoVue) StartPoolLog() {
go func() {
defer func() {
recover()
log.Println("统计协程异常")
}()
lastidle := 0
lastactive := 0
for ; ; {
all, idle, active := gv.jsRuntimePool.NumInfo()
if idle != lastidle || active != lastactive {
log.Println("所有:", all, "空闲:", idle, "活动:", active)
}
lastidle = idle
lastactive = active
time.Sleep(time.Second)
}
}()
}
func (gv *GoVue) LoadStaticResources(request *http.Request) (result []byte, err error) { func (gv *GoVue) LoadStaticResources(request *http.Request) (result []byte, err error) {
var path string var path string
var staticDir string var staticDir string
@ -90,6 +146,5 @@ func (gv *GoVue) LoadStaticResources(request *http.Request) (result []byte, err
result = []byte(data) result = []byte(data)
}) })
}) })
gv.jsRuntimePool.Log()
return return
} }

87
jsruntime/runtime.go

@ -1,10 +1,14 @@
package jsruntime package jsruntime
import ( import (
"crypto/md5"
"fmt"
"github.com/dop251/goja" "github.com/dop251/goja"
"github.com/go-errors/errors"
"io/ioutil" "io/ioutil"
"log" "log"
"net/url" "net/url"
"path/filepath"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -14,6 +18,7 @@ type JsRuntime struct {
MainSrc string MainSrc string
UseFileName string UseFileName string
UseSrc string UseSrc string
ExtFileDir string
Relys Relys Relys Relys
TimeoutSec int64 TimeoutSec int64
runtime *goja.Runtime runtime *goja.Runtime
@ -21,10 +26,9 @@ type JsRuntime struct {
} }
type Rely struct { type Rely struct {
Variable string
FileName string
Src string Src string
} }
type Relys []Rely type Relys []Rely
type RunMode int type RunMode int
@ -34,40 +38,52 @@ const (
//ModeAsync RunMode = 2 //ModeAsync RunMode = 2
) )
func NewJsRuntime(mainFileName string, useFileName string, rels Relys, mode RunMode) (*JsRuntime, error) {
mainScript, err := ioutil.ReadFile(mainFileName)
if err != nil {
return nil, err
}
jr := JsRuntime{
MainSrc: string(mainScript),
func NewJsRuntime(mainScript string, useFileName string, extFileDir string, rels Relys, mode RunMode) (jr *JsRuntime, err error) {
jr = &JsRuntime{
MainSrc: mainScript,
Relys: rels, Relys: rels,
UseFileName: useFileName, UseFileName: useFileName,
ExtFileDir: extFileDir,
TimeoutSec: 30, TimeoutSec: 30,
} }
jr.runtime = goja.New() jr.runtime = goja.New()
jr.EnableTimeoutFunc() jr.EnableTimeoutFunc()
jr.EnableIntervalFun() jr.EnableIntervalFun()
jr.EnableRequestFunc() jr.EnableRequestFunc()
jr.EnableConsoleFun() jr.EnableConsoleFun()
jr.SetVariable("GoRunCodeByFile", func(filePath string) {
code, err := ioutil.ReadFile(filepath.Join(jr.ExtFileDir, filePath))
if err != nil {
log.Println("GoRunCodeByFile Read Error:", err)
}
err = jr.RunCode(string(code))
if err != nil {
log.Println("GoRunCodeByFile Run Error:", err)
}
})
err = jr.InitJsCode() err = jr.InitJsCode()
if err != nil {
log.Println("InitJsCode", err)
}
return &jr, err
return jr, nil
} }
func (jr *JsRuntime) InitJsCode() error { func (jr *JsRuntime) InitJsCode() error {
for e := range jr.Relys { for e := range jr.Relys {
src, err := ioutil.ReadFile(jr.Relys[e].FileName)
if err != nil {
return err
}
jr.Relys[e].Src = string(src)
err = jr.RunCode(string(src))
//start := time.Now().UnixNano()
err := jr.RunCode(jr.Relys[e].Src)
//end := time.Now().UnixNano()
//log.Println(e, "加载时间:", end-start)
if err != nil { if err != nil {
log.Println("initjscode", err) log.Println("initjscode", err)
return err return err
@ -91,8 +107,28 @@ func (jr *JsRuntime) SetVariable(name string, value interface{}) {
jr.runtime.Set(name, value) jr.runtime.Set(name, value)
} }
var codeMap sync.Map
func (jr *JsRuntime) md5(data string) string {
return fmt.Sprintf("%x", md5.Sum([]byte(data)))
}
func (jr *JsRuntime) RunCode(code string) error { func (jr *JsRuntime) RunCode(code string) error {
_, err := jr.runtime.RunString(code)
id := jr.md5(code)
var p interface{}
var ok bool
p, ok = codeMap.Load(id)
if !ok {
pro, err := goja.Compile("", code, false)
if err != nil {
return err
}
codeMap.Store(id, pro)
p = pro
}
program := p.(*goja.Program)
_, err := jr.runtime.RunProgram(program)
return err return err
} }
@ -108,6 +144,7 @@ func (jr *JsRuntime) Render(filePath, href, tplSrc string, cb func(data string))
go func() { go func() {
time.Sleep(time.Duration(timeoutSec) * time.Second) time.Sleep(time.Duration(timeoutSec) * time.Second)
if isLock { if isLock {
log.Println("timeout")
runtime.Interrupt("timeout") runtime.Interrupt("timeout")
runtime.ClearInterrupt() runtime.ClearInterrupt()
} }
@ -116,19 +153,21 @@ func (jr *JsRuntime) Render(filePath, href, tplSrc string, cb func(data string))
isLock = false isLock = false
}() }()
_, err = runtime.RunString(useSrc)
if useSrc != "" {
err = jr.RunCode(useSrc)
if err != nil { if err != nil {
return
return errors.New(err.Error() + "1")
}
} }
url, err := url.Parse(href) url, err := url.Parse(href)
if err != nil { if err != nil {
return
return errors.New(err.Error() + "2")
} }
url2, err := url.Parse(strings.Replace(filePath, `\`, "/", -1)) url2, err := url.Parse(strings.Replace(filePath, `\`, "/", -1))
if err != nil { if err != nil {
return
return errors.New(err.Error() + "3")
} }
runtime.Set("GoHtmlSrc", tplSrc) runtime.Set("GoHtmlSrc", tplSrc)
@ -142,6 +181,10 @@ func (jr *JsRuntime) Render(filePath, href, tplSrc string, cb func(data string))
runtime.Set("GoReturn", func(data string) { runtime.Set("GoReturn", func(data string) {
cb(data) cb(data)
}) })
_, err = runtime.RunString(mainSrc)
err = jr.RunCode(mainSrc)
if err != nil {
return errors.New(err.Error() + "4")
}
return return
} }

33
jsruntime/timeout.go

@ -2,21 +2,48 @@ package jsruntime
import ( import (
"github.com/dop251/goja" "github.com/dop251/goja"
"time"
) )
func (jr *JsRuntime) EnableTimeoutFunc() { func (jr *JsRuntime) EnableTimeoutFunc() {
//
//var funs []func()
//var task func()
//task = func() {
// recover()
// go task()
// for ; ; {
// l := len(funs)
// if len(funs) > 0 {
// fun := funs[l-1]
// funs = funs[:l-1]
// fun()
// }
// time.Sleep(time.Second / 100)
// }
//}
//go task()
jr.runtime.Set("setTimeout", func(call goja.FunctionCall) goja.Value { jr.runtime.Set("setTimeout", func(call goja.FunctionCall) goja.Value {
//log.Println("setTimeout") //log.Println("setTimeout")
//log.Println(call.Argument(0)) //log.Println(call.Argument(0))
if fn, ok := goja.AssertFunction(call.Argument(0)); ok { if fn, ok := goja.AssertFunction(call.Argument(0)); ok {
delay := call.Argument(1).ToInteger()
//delay := call.Argument(1).ToInteger()
var args []goja.Value var args []goja.Value
if len(call.Arguments) > 2 { if len(call.Arguments) > 2 {
args = call.Arguments[2:] args = call.Arguments[2:]
} }
time.Sleep(time.Duration(delay) * time.Millisecond)
//time.Sleep(time.Duration(delay) * time.Millisecond)
fn(nil, args...) fn(nil, args...)
//
//time.AfterFunc(time.Duration(delay) * time.Millisecond, func(){
// fn(nil, args...)
//})
//funs = append(funs, func() {
// time.Sleep(time.Duration(delay) * time.Millisecond)
// fn(nil, args...)
//})
//log.Println("setTimeout ok") //log.Println("setTimeout ok")
} }
return jr.runtime.ToValue(123124512) return jr.runtime.ToValue(123124512)

45
pool/pool.go

@ -5,33 +5,59 @@ import (
"git.ouxuan.net/3136352472/go-service-template/jsruntime" "git.ouxuan.net/3136352472/go-service-template/jsruntime"
pool "github.com/jolestar/go-commons-pool" pool "github.com/jolestar/go-commons-pool"
"log" "log"
"time"
) )
type JsRuntimePool struct { type JsRuntimePool struct {
ctx context.Context ctx context.Context
jsRuntimePool *pool.ObjectPool jsRuntimePool *pool.ObjectPool
} }
type Config struct {
MaxIdle int
MinIdle int
MaxTotal int
}
var DefaultConfig Config
func NewJsRuntimePool(mainFile, useFileName string, relys jsruntime.Relys, mode jsruntime.RunMode) (jrp *JsRuntimePool) {
func NewJsRuntimePool(mainScript string, useFileName string, staticPath string, relys jsruntime.Relys, mode jsruntime.RunMode) (jrp *JsRuntimePool) {
jrp = &JsRuntimePool{} jrp = &JsRuntimePool{}
factory := pool.NewPooledObjectFactorySimple( factory := pool.NewPooledObjectFactorySimple(
func(context.Context) (interface{}, error) { func(context.Context) (interface{}, error) {
render, err := jsruntime.NewJsRuntime(mainFile, useFileName, relys, mode)
render, err := jsruntime.NewJsRuntime(mainScript, useFileName, staticPath, relys, mode)
return render, err return render, err
}) })
jrp.ctx = context.Background() jrp.ctx = context.Background()
if DefaultConfig.MaxIdle == 0 {
DefaultConfig.MaxIdle = 3000
}
if DefaultConfig.MinIdle == 0 {
DefaultConfig.MinIdle = 20
}
if DefaultConfig.MaxTotal == 0 {
DefaultConfig.MaxTotal = 200
}
jrp.jsRuntimePool = pool.NewObjectPoolWithDefaultConfig(jrp.ctx, factory) jrp.jsRuntimePool = pool.NewObjectPoolWithDefaultConfig(jrp.ctx, factory)
jrp.jsRuntimePool.Config.LIFO = false jrp.jsRuntimePool.Config.LIFO = false
jrp.jsRuntimePool.Config.MaxIdle = 1000
jrp.jsRuntimePool.Config.MinIdle = 5
jrp.jsRuntimePool.Config.MaxTotal = 3000
jrp.jsRuntimePool.Config.MaxIdle = DefaultConfig.MaxIdle
jrp.jsRuntimePool.Config.MinIdle = DefaultConfig.MinIdle
jrp.jsRuntimePool.Config.MaxTotal = DefaultConfig.MaxTotal
jrp.jsRuntimePool.Config.BlockWhenExhausted = true jrp.jsRuntimePool.Config.BlockWhenExhausted = true
go func() {
for ; ; {
jrp.jsRuntimePool.PreparePool(jrp.ctx) jrp.jsRuntimePool.PreparePool(jrp.ctx)
time.Sleep(time.Second / 5)
}
}()
return return
} }
@ -55,3 +81,10 @@ func (jrp *JsRuntimePool) Log() {
all := idle + active all := idle + active
log.Println("所有:", all, "空闲:", idle, "活动:", active) log.Println("所有:", all, "空闲:", idle, "活动:", active)
} }
func (jrp *JsRuntimePool) NumInfo() (int, int, int) {
idle := jrp.jsRuntimePool.GetNumIdle()
active := jrp.jsRuntimePool.GetNumActive()
all := idle + active
return all, idle, active
}

18
static/css/main.css

@ -0,0 +1,18 @@
html, body {
margin: 0;
padding: 0;
color: #888888;
}
#app {
text-align: center;
margin-top: 300px;
}
#app h1 {
font-size: 68px;
}
#app p {
font-size: 28px;
}

33
static/index.html

@ -1,18 +1,31 @@
<!DOCTYPE html>
<!doctype html>
<html lang="zh" govue-id="index"> <html lang="zh" govue-id="index">
<head> <head>
<meta charset="UTF-8">
<title>Title</title>
<meta charset="utf-8">
<meta name="keywords" content="">
<link rel="stylesheet" href="css/main.css">
<script src="js/vue.min.js"></script>
</head> </head>
<body> <body>
<div id="app"> <div id="app">
code : {{code}}
query : {{data.query}}
method : {{data.method}}
a : {{a}}
<test-component></test-component>
<my-title></my-title>
<a v-on:click="click" class="gv-ignore">{{desc}}</a>
</div> </div>
<script src="../govue-js-src/dist/index.js"></script>
<script src="use.js"></script>
<pre id="pre">{{pre}}</pre>
</body> </body>
<script src="index.js" govue-src></script>
<script>
new Vue({
el: "#app",
methods:{
click:function () {
alert("点击触发");
}
}
});
</script>
</html> </html>

6
static/index.js

@ -0,0 +1,6 @@
new Vue({
el: "#pre",
data: {
pre: "扩展参数\nhtml上的gv属性,值为页面id\nserc上的gv属性,表示脚本需要服务端渲染"
}
});

6
static/js/vue.min.js
File diff suppressed because it is too large
View File

40
static/use.js

@ -1,37 +1,29 @@
//公用 //公用
GoUse(function () { GoUse(function () {
Vue.component('test-component', {
template: '<div>test-component</div>'
// 定义一个名为 button-counter 的新组件
document.title = "govue";
document
.getElementsByName("keywords")[0]
.setAttribute("content", "govue,服务端渲染,ssr");
Vue.component('my-title', {
template: '<h1 id="title">govue</h1>'
}); });
}); });
//分页面 //分页面
GoUseRegistered("index", function (query) { GoUseRegistered("index", function (query) {
console.log("query:", query); console.log("query:", query);
// 定义一个名为 button-counter 的新组件
var vue = new Vue({
new Vue({
el: "#app", el: "#app",
data: { data: {
code: -1,
data: "",
a: ""
"desc": "基础golang开发的一套vue服务端渲染方案"
}, },
}); });
axios.defaults.baseURL = "http://127.0.0.1:8080/";
axios.get('/test?t=123123123')
.then(function (result) {
console.log(JSON.stringify(result.data));
var data = result.data;
vue.code = data.code;
vue.data = data.data;
vue.a = 123;
})
.catch(function (error) {
console.log("err");
console.log(error);
})
.then(function () {
// always executed
});
console.log("end");
}); });
Loading…
Cancel
Save