yi-ge / Vue-SSR-Koa2-Scaffold

Vue SSR Koa2 Scaffold (基于Vue 2,Webpack 4,Koa 2的Vue SSR脚手架。)
https://www.wyr.me/post/593
60 stars 27 forks source link

api 内require某份文件时,__dirname无法指向当前文件所在目录 #1

Open hdmy opened 4 years ago

hdmy commented 4 years ago
// -> https://github.com/yi-ge/Vue-SSR-Koa2-Scaffold/blob/master/src/api/app.js
require('./a')()

// -> api/a.js
module.exports = function() {
    console.log(__dirname, __filename)
    try {
        require(path.resolve(__dirname, './b.js'))
    }catch(error) {
        console.error(error) // { Error: Cannot find module '/b.js' }
    }
}

// -> api/b.js
console.log('I am here')  //不会被执行

请问如何解决这种文件引入问题呢? 实际场景是sequelize import model代码),__dirname的应用绕不过,谢谢!

yi-ge commented 4 years ago

不用require或者加上触发条件。在node.js中执行一个文件中的代码有很多种方法。可以换几个方法试试。

yi-ge commented 4 years ago

new Function、vm之类的

hdmy commented 4 years ago

image

主要还是因为文件路径dirname的问题导致的 个人分析:是因为用了数据库(发现脚手架中并没有使用数据库、koa-router 等,遇到了好多问题),这一份会被打包进api.js中,而开发环境里api.js的引入是 MFS文件读取,导致dirname不正确的问题

hdmy commented 4 years ago

用这个脚手架最让我舒服的地方就是每次改serve的代码都不用重启一遍,这里的文件读取有办法绕开,或者修正__dirname的可能吗? https://github.com/yi-ge/Vue-SSR-Koa2-Scaffold/blob/master/config/setup-dev-server.js#L84

yi-ge commented 4 years ago

路径不对没关系,可以在服务器端进行ssr渲染的时候,改写__dirname的值。

hdmy commented 4 years ago

可以举个例子吗?在哪里做改写?(应该不是在api/app.js里直接__dirname = './xxx/xx'这样子吧?)

yi-ge commented 4 years ago

https://github.com/yi-ge/Vue-SSR-Koa2-Scaffold/blob/b67d0e81d6e07ea2aa23d377542f761626dbf130/config/ssr.js#L45行,对eval方法进行改写,换用别的方式加载后端代码。__dirname的问题就在此处。

yi-ge commented 4 years ago

问题解决了吗?