如何为 laravel vue 单文件组件解析 mocha-webpack 中的别名
How to resolve aliases in mocha-webpack for laravel vue single file components
我在 Laravel 5.7 中使用 vuejs 构建 SPA。我正在使用 mocha-webpack 和 vue-test-utils 编写一些 vue 组件测试。
这些测试似乎无法将样式表导入到组件中。例如:我有一个 ExampleComponent.vue 其中包括以下内容:
</script>
<style lang="scss" scoped>
@import '@/_variables.scss';
.subpanel-control > ul > li {
background-color: lighten($body-bg, 50);
margin-left: 10px;
height: 25px;
width: 25px;
line-height: 25px;
color: $body-bg;
}
当 运行 npm run test
我得到以下错误:
Error in ./resources/assets/js/components/Panel.vue?vue&type=style&index=0&id=21f01f46&lang=scss&scoped=true&
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
@import '@/variables';
^
Can't find stylesheet to import.
╷
98 │ @import '@/variables';
│ ^^^^^^^^^^^^^
╵
stdin 98:9 root stylesheet
in C:\Users\jjackson\Documents\projects\wave\resources\assets\js\components\Panel.vue (line 98, column 9)
我不明白为什么它不理解别名 @。这是我的 webpack.mix.js:
let mix = require('laravel-mix');
const path = require('path');
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css')
.sass('resources/assets/sass/nifty.scss', 'public/css', {
implementation: require('node-sass')
})
.sass('resources/assets/sass/themes/type-b/theme-ocean.scss', 'public/css')
.less('resources/assets/less/bootstrap-4-utilities.less', 'public/css')
.webpackConfig({
resolve: {
alias: {
'@': path.resolve('resources/assets/sass'),
'~': path.resolve('resources/assets/js')
}
}
})
.sourceMaps();
if (mix.inProduction()) {
mix.version();
}
如有任何帮助,我们将不胜感激
在努力解决同样的问题时,我登陆了这个页面 - https://github.com/vuejs/vue-cli/issues/4053 和 robbishop 的评论引导我找到了我的解决方案。
使用上面的方法,我设法在 webpack.mix.js 中找到了一个似乎有效的配置:
- 首先安装 null-loader (npm i -D null-loader)
- 在规则中添加以下行:
{ test: /\.scss$/, use: [{ loader: 'null-loader' }] }
我的 webpack.mix.js 看起来像这样:
const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.webpackConfig({
module: {
rules: [
{ test: /\.scss$/, use: [{ loader: 'null-loader' }] }
]
},
resolve: {
alias: {
'@': path.resolve('somepath/sass')
}
}
})
.sass('some/path/app.scss', 'some/path/css');
我的单元测试现在在我的组件中导入 scss 时执行。
这原来是一个 docker 问题。试图 运行 npm run dev
在 docker 环境之外,它导致了这个错误。当我 运行 容器内的所有 npm 命令时,一切正常
我在 Laravel 5.7 中使用 vuejs 构建 SPA。我正在使用 mocha-webpack 和 vue-test-utils 编写一些 vue 组件测试。
这些测试似乎无法将样式表导入到组件中。例如:我有一个 ExampleComponent.vue 其中包括以下内容:
</script>
<style lang="scss" scoped>
@import '@/_variables.scss';
.subpanel-control > ul > li {
background-color: lighten($body-bg, 50);
margin-left: 10px;
height: 25px;
width: 25px;
line-height: 25px;
color: $body-bg;
}
当 运行 npm run test
我得到以下错误:
Error in ./resources/assets/js/components/Panel.vue?vue&type=style&index=0&id=21f01f46&lang=scss&scoped=true&
Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
@import '@/variables';
^
Can't find stylesheet to import.
╷
98 │ @import '@/variables';
│ ^^^^^^^^^^^^^
╵
stdin 98:9 root stylesheet
in C:\Users\jjackson\Documents\projects\wave\resources\assets\js\components\Panel.vue (line 98, column 9)
我不明白为什么它不理解别名 @。这是我的 webpack.mix.js:
let mix = require('laravel-mix');
const path = require('path');
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css')
.sass('resources/assets/sass/nifty.scss', 'public/css', {
implementation: require('node-sass')
})
.sass('resources/assets/sass/themes/type-b/theme-ocean.scss', 'public/css')
.less('resources/assets/less/bootstrap-4-utilities.less', 'public/css')
.webpackConfig({
resolve: {
alias: {
'@': path.resolve('resources/assets/sass'),
'~': path.resolve('resources/assets/js')
}
}
})
.sourceMaps();
if (mix.inProduction()) {
mix.version();
}
如有任何帮助,我们将不胜感激
在努力解决同样的问题时,我登陆了这个页面 - https://github.com/vuejs/vue-cli/issues/4053 和 robbishop 的评论引导我找到了我的解决方案。 使用上面的方法,我设法在 webpack.mix.js 中找到了一个似乎有效的配置:
- 首先安装 null-loader (npm i -D null-loader)
- 在规则中添加以下行:
{ test: /\.scss$/, use: [{ loader: 'null-loader' }] }
我的 webpack.mix.js 看起来像这样:
const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.webpackConfig({
module: {
rules: [
{ test: /\.scss$/, use: [{ loader: 'null-loader' }] }
]
},
resolve: {
alias: {
'@': path.resolve('somepath/sass')
}
}
})
.sass('some/path/app.scss', 'some/path/css');
我的单元测试现在在我的组件中导入 scss 时执行。
这原来是一个 docker 问题。试图 运行 npm run dev
在 docker 环境之外,它导致了这个错误。当我 运行 容器内的所有 npm 命令时,一切正常