瘦人说

调用expressjs中compiler方法的问题

express.compiler方法是expressjs框架提供的一个动态编译源文件到目标文件的方法,每次GET请求相同名字的目标文件时,会去查找同名源文件来生成,这样对于整合sass、less、coffeescript十分有用。但昨天在整合sass到expressjs时候,发现了个配置sass的路径的问题。该方法调用方式如下:

app.use(express.compiler({
    enable : ['sass'],
    src : sourceUrl,
    dest : destinationUrl
}));

compiler方法接受3个参数,enable的编译器数组,src代表源文件路径,这里代表sass文件的路径,最后一个dest指的是目标路径,就是生成为css文件的路径。

现在我的项目结构如下:

myapp
├── app.js
├── public
│   └── stylesheets
│       └── main.css
├── sass
│   └── main.sass 
└── ...

想把myapp目录下的sass文件夹中的所有sass文件能动态的生成到public/stylesheets文件夹下,本以为看把compiler调用时的src路径设置为__dirname + ‘/sass’,然后dest的值设置为__dirname + ‘/public/stylesheets’ 便可以了,这是多么理想的状态啊。

// 理想情况,但是不work
app.use(express.compiler({
    enable : ['sass'],
    src : __dirname + '/sass',
    dest : __dirname + '/public/stylesheets'
}));

结果不行,换不同的路径试了很多次,有些时候能生成,还去stackoverflow上查询了很久,结果都没有想要的答案。我便看了下compiler方法的源码,原来生成原理是这样的。

每次GET请求一个文件的时候,例如http://localhost:3000/stylesheets/main.css时,此方法会生成两个路径,源文件路径和目标文件路径,根据代码来看,会根据当前的url来找到pathname,追加到调用方法时指定的src和dest的值上,此时找到的pathname就是/stylesheets/main.css,那么源文件路径就会是我指定的__dirname + ‘/sass/stylesheets/main.sass’,目标路径就成为__dirname + ‘/public/stylesheets/stylesheets/main.css’,很明显两个路径都错误了。怪就怪它是用pathname去追加,而不是只用/main.css追加。

现在搞清楚状况了,无奈的事情发生了,如果我真想在code里面使用http://localhost:3000/stylesheets/main.css这样的路径去请求css文件,那么原路径中需要包含stylesheets这个子文件夹。通过我有想过把它的方法修改了,但是它是个get方法,不能被修改。唯有委曲求全了。

现在把文件目录改成了:

myapp
├── app.js
├── public
│   ├── stylesheets
│   │   └── main.css
│   └── scripts
│       └── main.js
├── stylesheets // 不得已把sass变为stylesheets
│   └── main.sass 
└── scripts
    └── main.coffee

调用方式变成了:

// work,但是src和dest看上去都是很奇怪的配置
app.use(express.compiler({
    enable : ['sass'],
    src : __dirname,
    dest : __dirname + '/public'
}));

同样的方式也可以来配置coffeescript。虽然现在可以加载到目标文件,但是看起来不是那么舒服,还是有些遗憾,如果大家看了之后有其他更好的加载方式可以告诉我。Btw,如果你不想使用原生的compiler方法去生成css文件,那么你可以尝试下Stylus Middleware 貌似没有这个问题。

Comments

Proudly published with Hexo