【发布时间】:2018-03-25 12:59:32
【问题描述】:
我想在我的 less 文件中使用内联 js,但我收到以下消息:
内联 JavaScript 未启用。是否在您的选项中设置?
我该如何启用它?
【问题讨论】:
标签: javascript npm less laravel-mix
我想在我的 less 文件中使用内联 js,但我收到以下消息:
内联 JavaScript 未启用。是否在您的选项中设置?
我该如何启用它?
【问题讨论】:
标签: javascript npm less laravel-mix
我也遇到了同样的问题,我使用 webpack 和 less loader,我需要在 less loader 配置中添加 javascript 选项:
{
test: /\.less$/,
use: [{
loader: "style-loader"
}, {
loader: "css-loader"
}, {
loader: "less-loader",
options: {
javascriptEnabled: true
}
}]
}
在less编译器的源码中找到:https://github.com/less/less.js/blob/3.x/bin/lessc
他们以这种方式解析 js less 选项:
case 'js':
options.javascriptEnabled = true;
break;
case 'no-js':
console.error('The "--no-js" argument is deprecated, as inline JavaScript ' +
'is disabled by default. Use "--js" to enable inline JavaScript (not recommended).');
break;
因此,您可能应该在静态编译(命令行)中使用“--js”或在动态编译(如 webpack 加载器)中使用“javascriptEnabled: true”来启用 javascript。
【讨论】:
我在使用最新版本的less时遇到了这个问题。然后我切换到 2.7 版本并修复了它。
【讨论】:
出于安全考虑,默认情况下禁用内联 JavaScript。发生的情况是,在线生成器有时会允许配置 Less 变量,然后直接解释。
这很容易受到代码注入的影响,这意味着可以将 JavaScript 注入到直接在服务器上运行的 Less 样式表中。
出于这个原因,内联 JavaScript 已被弃用(在 3.x 中默认设置为 false),取而代之的是 @plugin 语法并使用适当的 JS 插件。 - (见:http://lesscss.org/features/#plugin-atrules-feature)
是的,您仍然可以将编译选项设置为javascriptEnabled: true,但这并不是样式表的最佳做法。通常,您的样式表中不应包含 JS。最好使用插件。
【讨论】:
对 @matthew-dean 和 @davide-carpini 所说的一切都是肯定的……但对于任何寻找 Grunt-LESS 代码 sn-p 的人来说:
less: {
dev: {
options: {
paths: ['Content/less'],
plugins: [
new(require('less-plugin-autoprefix'))({
browsers: ['last 2 versions']
}),
new(require('less-plugin-clean-css'))({
sourceMap: true,
advanced: true
})
],
relativeUrls: true,
javascriptEnabled: true
},
files: {
'Content/less/site.css': 'Content/less/site.less'
}
}
},
这适用于我使用"grunt-contrib-less": "^2.0.0" 的实施...您的里程可能会有所不同
【讨论】:
我遇到了同样的问题,但在 vue-cli 4 + iVueUi 主题定制中。也许有人和我有同样的烦恼。这就是解决方案:
在项目的根目录创建或使用现有的vue.config.js 文件。并将此代码(或部分添加)添加到其中。
module.exports = {
css: {
loaderOptions: {
less: {
javascriptEnabled: true
}
}
}
};
但请记住,出于安全原因,js 默认情况下是禁用的。所以这需要您自担风险。
【讨论】:
只是为了更新接受的答案,
从 3.11.1 开始,如果你只使用options,它会抛出:
ValidationError:无效的选项对象。更少的装载机已经 使用与 API 不匹配的选项对象进行初始化 架构。 - 选项具有未知属性“javascriptEnabled”。这些属性是有效的:object {lessOptions?, prependData?, appendData?,sourceMap?,实现? }
在less@3.11.1中,不只是options应该使用,而是lessOptions这样:
{
test: /\.less$/,
use: [{
loader: "style-loader"
}, {
loader: "css-loader"
}, {
loader: "less-loader",
options: {
lessOptions: {
javascriptEnabled: true
}
}
}]
}
【讨论】:
less-loader 版本6.1.0^。在“less-loader”版本 6.1.0^ 中,他们对加载器进行了重大更改,如果您使用 Ant Design(或其他 LESS 和 JS 加载器)之类的东西,您通常会将 javascriptEnabled: true 标志添加到“选项”对象在你的 Webpack 配置中。
在版本 6.1.0^ 中,此更改被放置在 less 加载器选项配置下的 lessOptions 对象中。这是我使用的解决方案,适用于我的 Webpack 配置包。
module: { rules: [{
test: /\.less$/,
use: [
{ loader: "style-loader" },
{ loader: "css-loader" },
{
loader: "less-loader",
options: {
lessOptions: {
javascriptEnabled: true,
}
}
}
]
}]}
请注意,javascriptEnabled 标志不在顶级选项对象下,而是在 lessOptions 子对象下。这是 less-loader 版本 6.1.0^ 的最新更新标准。
【讨论】:
如果您使用的是lessc cli 界面,那么您只需要最后使用--js。
lessc --js ./styles/theme.less ./styles/theme.css
【讨论】:
当我使用craco 和craco-less 并且还通过我的.less 文件自定义ant design 的变量时,像下面这样对craco.config.js 进行修正解决了我的问题:
const CracoLessPlugin = require('craco-less')
module.exports = {
plugins: [
{
plugin: CracoLessPlugin,
options: {
lessLoaderOptions: {
lessOptions: {
javascriptEnabled: true,
},
},
},
},
],
}
【讨论】: