【问题标题】:Using Vue without bundlers?在没有捆绑器的情况下使用 Vue?
【发布时间】:2018-06-23 01:46:36
【问题描述】:

我正在创建一些实验性网站,它们使用 JavaScript 而不进行捆绑。对于依赖管理,我一直使用 RequireJS,但最近我开始使用 SystemJS,因为它对 HTTP2 有一些非常好的支持。到目前为止,我已经在我的自定义设置 Web 服务器上做了一些实验,结果对于我正在创建的网站来说非常好。例如,首页渲染发生在 400 毫秒左右,整页加载发生在 800 毫秒等。

我这样做是因为我想充分利用 HTTP2,并且我想延迟加载我在某个时刻使用的脚本。像这样的代码更容易维护,缓存更好等等。目前对 Webpack 之类的打包工具很热,但这不是我想要使用的东西。

问题来了:有没有办法使用 Gulp 编译单个 Vue 文件/组件,然后使用 SystemJS 作为 AMD 或 CommonJS 模块加载它们?

编辑:

这就是我想用 SystemJS 和 Vue 实现的目标:

入口点JS文件:

// SystemJS config
SystemJS.config({
  /* ... */
  
  baseURL: './',
  map: {
    // App
    'app': 'scripts/app.min.js',
  
    // Utils
    'axios': 'scripts/vendor/axios/axios.min.js',
    'modernizr': 'scripts/vendor/modernizr/modernizr.min.js',    
  
    // Framework
    'vue': 'scripts/vendor/vue/vue.min.js',
    
    // Components
    'vueHelloWorld': 'scripts/components/hello/vueHelloWorld.js', // <- Compiled VUE component
    'vueMenu': 'scripts/components/menu/vueMenu.js'
  },
  depcache: {
    'vueHelloWorld': ['vue'],
    'vueMenu': ['vue', 'vueHelloWorld']
  }
  
  /* ... */
)};

// Initially Load default scripts
require(['modernizr', 'axios', 'app']);

Vue 组件 vueHelloWorld.js 和 vueMenu.js 是最终结果,从单个文件模板 vueHelloWorld.vue 和 vueMenu.vue 编译成纯 JS。

在那个初始文件之后,app.min.js 被加载,它会声明加载渲染的 vue 组件。

这是我不知道该怎么做的——如何为我想以这种方式加载的每个 Vue 组件呈现单独的文件?

【问题讨论】:

  • 我认为systemjs-builder 会引起您的兴趣。要研究的另一件事是让您的转译器为每个源模块输出匿名注册模块。
  • 我想避免捆绑,其次我想将每个 vue 组件渲染成一个单独的文件,可以根据需要加载(必需)。
  • 转译到匿名注册模块可以实现这一点。你想compile而不是bundle,我说得对吗?
  • 我已经扩展了我的问题,现在更清楚了吗?
  • 本文描述了一种方法,但不确定它与您的结构的其余部分的匹配程度:medium.com/@jamesweee/…

标签: javascript vue.js gulp vuejs2 vue-component


【解决方案1】:

如果我正确理解了这个问题,那么您所要寻找的只是需要一个 *.vue 文件并返回一个已编译的 *.js 文件的东西。您可以尝试使用https://github.com/vuejs/vue-component-compiler 编写自己的东西,或者我最终做的是滥用 rollup 作为我的 vue 编译器,对其进行配置,以便它忽略所有依赖项,因此采用一个 vue 组件并只编译该一个组件.在这里你可以看到实现这一点的配置:https://github.com/ecosia/bazel_rules_nodejs_contrib/blob/master/internal/vue_component/rollup.config.js

【讨论】:

    【解决方案2】:

    看来Async components 和webpacks code splitting 就是你要找的。​​p>

    在这里您可以找到一篇关于使用它们的文章:

    https://vuejsdevelopers.com/2017/07/03/vue-js-code-splitting-webpack/

    【讨论】:

    • 我不想创建代码包,尤其是在 webpack 方式中,每个包都有一些随机名称,例如 bundle.0.js。想法是将每个vue文件渲染成一个单独的带有逻辑名称的javascript文件,然后根据需要延迟加载。通过这种方式,我不必担心 treeshaking,我可以在任何我想要的地方重用这些组件,而无需将它们捆绑到另一个包中。通过这种方式,站点性能、缓存和维护要容易得多。在没有大型 JS 框架的常规 JS 项目上在生产环境中测试和确认。
    【解决方案3】:

    不,因为单个 Vue 文件 (*.vue) 只能通过 webpack 被 vue-loader 识别,SystemJS 或 AMD 或 CommonJS 与它完全无关,这三个是模块化标准或使您的 javascipts 文件组织的方法。

    你也可以这样写。

    a.component.js

    var ComponentA = {
        template: '#view-a',
    }
    

    b.component.js

    var ComponentB = {
        template: '#view-b',
    }
    

    然后在你的html文件中

    <script type="text/x-template" id="view-a">
        <div> .... </div>
    </script>
    
    <script type="text/x-template" id="view-b">
        <div> .... </div>
    </script>
    

    【讨论】:

    • 我知道用webpack可以识别vue文件。我的问题是 - 如何将 VUE 文件编译成常规 javascript,然后使用 SystemJS 要求它?我不想捆绑此代码,我想将其用作未捆绑的模块。但是,Vue 似乎主要用于 webpack,这对我来说是这个框架的第一个缺点。
    • 你为什么要把VUE文件编译成普通的javascript,你可以用普通的javascript在里面写单独的组件。
    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多